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

时间:2017-11-30 14:38:32

标签: c++ iterator

插入元素时std::map迭代器保持有效,例如:

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无效(未进行重新分配时),但在这种情况下,docs明确提及{{} 1}}。根据这个推理,&#34;没有迭代器失效&#34;应该包括end,但我并不是100%确信;)

1 个答案:

答案 0 :(得分:4)

  

N4140 23.2.4关联容器[associative.reqmts] [1]

     

9 insert和emplace成员不应影响迭代器和容器引用的有效性,擦除成员只能使迭代器和对擦除元素的引用无效。

术语迭代器肯定是指所有迭代器,包括end