当没有迭代器失效时,这是否包括结束迭代器?



Astd::maps 迭代器在插入元素时保持有效,例如:

std::map<std::string,int> my_map;
my_map["foo"] = 1;
my_map["bar"] = 2;
auto it_foo = my_map.find("foo");
auto it_bar = my_map.find("bar"); 
my_map["foobar"] = 3;

插入另一个元素(在最后一行)后,两个迭代器仍然有效。end怎么样?例如:

auto it_end = my_map.find("something that isnt in the map");
my_map["barfoo"] = 4; // does not invalidate iterators
assert(it_end == my_map.end()); // ??

换句话说:如果一个方法没有使迭代器无效(除了那些明确提到的,例如在map::erase的情况下),这是否意味着end也保证在调用该方法之前和之后相同?

PS:我知道我可以尝试看看,但这不会告诉我我是否可以依靠这种行为。

PPS:例如,推送到std::vector会使所有迭代器失效,或者仅使end无效(当没有发生重新分配时),但在这种情况下,文档明确提到了end。按照这个推理,"没有迭代器无效"应该包括end,但我不是100%相信;)

> N4140 23.2.4 关联容器 [associaciative.reqmts][1]

9 插入和放置成员不应影响迭代器和对容器的引用的有效性,擦除成员应仅使迭代器和对已删除元素的引用无效。

当然,术语迭代器是指包括end在内的所有迭代器。

最新更新