gpt4 book ai didi

c++ - 标准如何处理容器插入函数中的自引用迭代器?

转载 作者:可可西里 更新时间:2023-11-01 16:46:09 26 4
gpt4 key购买 nike

在处理像 std::vector 这样的 C++ 标准库容器时,它们基于范围的插入方法如何处理用户使用引用 vector 自身内容的迭代器?

大概如果他们说 vector::iterator 已经存在,那么实现可以对这种情况进行特殊处理,但是如果它们是最终导致访问 vector 的用户定义类型,那么如何vector 是否处理在评估范围时保持这些迭代器有效的问题?标准是否只是禁止引用范围内的 vector ?

举个简单的例子,考虑一个 value_type 是 size_t 的迭代器,取消引用它的结果是插入到的 vector 的大小。

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());

最佳答案

23.2.3 表 100 中的 C++11 n3242(略旧的草稿)中,我们了解到对于迭代器对 insert 函数,pre : i 和 j 不是 a 的迭代器。我相信基于该措辞,我会选择宽泛地解释为 i 和 j 不得访问 a,并且您的两个迭代器都是未定义的行为。

但可以说我的广义解释不是标准的本意。然后回答你的问题,对于输入迭代器,结果几乎肯定是:3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 5, 6, 7 而对于前向迭代器或更好的 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 73, 4, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 5, 6, 7 取决于大小是在元素复制到之前还是之后更新开放空间。在这种情况下,我在任何地方都看不到指定前向迭代器的结果。

关于c++ - 标准如何处理容器插入函数中的自引用迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16508509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com