For循环退出条件与地图迭代器
For loop exit condition with map iterator
我有一个std::map<str,int> my_map
现在,键值映射看起来像这样 -
{["apple",3],["addition",2],["app",7],["adapt",8]}
Objective:
计算具有给定前缀的键值的总和。
示例:sum("ap")
应该 return 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
的过程中变为假,从而计算出不正确的总和?
我不知道代码是如何给出正确结果的。为什么在查找前缀“ap
”时到达键“addition
”时循环不退出?
感谢任何形式的帮助。
循环完全正确,但乍一看可读性不佳。
我们有 std::map
这是一个关联容器,并根据提供的比较功能进行排序。对于您的地图(即 std::map<std:.string, int>
),它将根据 std::string
(即键)进行排序。
所以你的地图已经订购了:
{["adapt",8], ["addition",2], ....., ["app",7], ["apple",3], .... }
现在让我们从 std::lower_bound
:
开始
Returns an iterator pointing to the first element in the range [first,
Last) that is not less than (i.e. greater or equal to) value, or last
if no such element is found.
循环开始时的含义:
auto it = my_map.lower_bound(prefix);
迭代器 it
指向映射条目 ["app",7]
。在其他情况下,迭代从第一个可能的开始开始。
["app",7], ["apple",3], ....
现在开始播放条件:
it != my_map.end() && it->first.substr(0, n) == prefix;
第一个看迭代器是否有效(即it != my_map.end()
)。
第二个检查前缀是否与键开始相同(即 it->first.substr(0, n) == prefix;
)。由于我们从排序的可能前缀开始,循环的结果将是正确的。
我有一个std::map<str,int> my_map
现在,键值映射看起来像这样 -
{["apple",3],["addition",2],["app",7],["adapt",8]}
Objective:
计算具有给定前缀的键值的总和。
示例:sum("ap")
应该 return 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
的过程中变为假,从而计算出不正确的总和?
我不知道代码是如何给出正确结果的。为什么在查找前缀“ap
”时到达键“addition
”时循环不退出?
感谢任何形式的帮助。
循环完全正确,但乍一看可读性不佳。
我们有 std::map
这是一个关联容器,并根据提供的比较功能进行排序。对于您的地图(即 std::map<std:.string, int>
),它将根据 std::string
(即键)进行排序。
所以你的地图已经订购了:
{["adapt",8], ["addition",2], ....., ["app",7], ["apple",3], .... }
现在让我们从 std::lower_bound
:
Returns an iterator pointing to the first element in the range [first, Last) that is not less than (i.e. greater or equal to) value, or last if no such element is found.
循环开始时的含义:
auto it = my_map.lower_bound(prefix);
迭代器 it
指向映射条目 ["app",7]
。在其他情况下,迭代从第一个可能的开始开始。
["app",7], ["apple",3], ....
现在开始播放条件:
it != my_map.end() && it->first.substr(0, n) == prefix;
第一个看迭代器是否有效(即it != my_map.end()
)。
第二个检查前缀是否与键开始相同(即 it->first.substr(0, n) == prefix;
)。由于我们从排序的可能前缀开始,循环的结果将是正确的。