在处理 C++ 标准库容器(如std::vector
)时,它们的基于范围的插入方法如何使用引用向量自身内容的迭代器来处理用户?
据推测,如果他们已经说过vector::iterator
,那么实现可以特例这种情况,但如果它们是最终导致访问向量的用户定义类型,那么向量如何处理在评估范围时保持这些迭代器有效?标准是否只是禁止引用范围内的向量?
举个简单的例子,考虑一个 value_type 为 size_t 的迭代器,取消引用它的结果是插入的向量的大小。
struct silly_iterator {
vector<std::size_t>* v;
unsigned number;
std::size_t operator*() { return v->size(); }
operator++() { --number; }
bool operator==(silly_iterator other) const { return number == 0; }
// other methods
};
std::vector<std::size_t> vec = { 3, 4, 5, 6, 7 };
vector.insert(vector.begin() + 2, silly_iterator(&vec, 10), silly_iterator());
vec
这段代码执行后的内容是什么?
再举一个例子,
struct silly_iterator {
std::vector<std::size_t>* v;
std::size_t operator*() { return 0; }
operator++() { --number; v->push_back((*v)[4]); }
bool operator==(silly_iterator other) const { return number == 0; }
// other methods
};
std::vector<std::size_t> vec = { 3, 4, 5, 6, 7 };
vec.insert(vec.begin() + 2, silly_iterator(&vec, 10), silly_iterator());