std::back_insert_iterator是否受容器迭代器失效规则约束?
迭代器失效规则是否适用于std::back_insert_iterator?
我自认为知道答案,但还是想验证一下:迭代器失效规则是否适用于std::back_insert_iterator?
以下是测试代码:
#include <cassert> #include <iterator> #include <vector> int main() { auto v = std::vector<int>{ 0, 1, 2 }; auto iter = std::back_inserter(v); *iter++ = 3; v.clear(); // 使迭代器失效,但 *iter++ = 4; // back_insert_iterator是否特殊? assert(v.size() == 1 && v[0] == 4); return 0; }
这段代码在我的环境中可以正常运行,因为我所用编译器实现的std::back_insert_iterator并没有持有迭代器、指针或引用,只是调用容器的push_back方法。
但我有个疑问:C++标准是否强制要求这种实现方式?有没有厂商的std::back_insert_iterator是通过持有并维护尾后迭代器、调用insert方法来实现的?这种实现看起来好像合规,但会遇到迭代器失效的问题。
我知道cppreference.com不具备权威性,但它比标准文档更容易获取,上面提到:
[vector的clear方法] 使所有指向容器元素的迭代器失效。所有尾后迭代器也会失效。
std::back_insert_iterator可以说是尾后迭代器的典型代表。
内容的提问来源于stack exchange,提问作者Adrian McCarthy
相关产品推荐
相关产品推荐

