带有映射迭代器的 For 循环退出条件

我有一个std::map<str,int> my_map

现在,键值映射看起来像这样 -

{["apple",3],["addition",2],["app",7],["adapt",8]}

目标

计算具有给定前缀的键值的总和。 示例:sum("ap") 应返回 10 (3 + 7)

我可以用两个循环和一个 if 条件来实现它。但是,我正在尝试理解某人提交的以下代码来实现这一点。

for (auto it = my_map.lower_bound(prefix); 
    it != my_map.end() && it->first.substr(0,n) == prefix;
    it++)

循环条件在遍历 my_map 的过程中会不会变为假,从而计算出错误的总和?

我不知道代码如何能够给出正确的结果。为什么循环在查找前缀“addition”时到达键“ap”时不会退出?

感谢任何形式的帮助。

z2h5a1n5g 回答:带有映射迭代器的 For 循环退出条件

循环完全正确,但乍一看不太好读。

我们有 std::map,它是一个关联容器,并根据提供的比较函数进行排序。对于您的地图(即 std::map<std:.string,int>),它将根据 std::string(即键)进行排序。

所以你的地图已经被排序了:

{["adapt",8],["addition",2],.....,["app",7],["apple",3],.... }

现在让我们从 std::lower_bound 开始:

返回一个指向范围内第一个元素的迭代器 [first,最后)不小于(即大于或等于)值,或最后 如果没有找到这样的元素

循环开始处的含义:

auto it = my_map.lower_bound(prefix);

迭代器 it 指向映射条目 ["app",7]。否则,迭代从第一个可能的开始开始。

["app",.... 

现在条件开始发挥作用:

it != my_map.end() && it->first.substr(0,n) == prefix;

第一个查看迭代器是否有效(即it != my_map.end())。 第二个检查前缀是否与键开始相同(即 it->first.substr(0,n) == prefix;)。由于我们从排序的可能前缀开始,循环的结果将是正确的。

本文链接:https://www.f2er.com/4138.html

大家都在问