insert_iterator无效规则
insert_iterator invalidation rules
STL 容器执行哪些操作可以使引用该容器的C++ std::insert_iterator
无效?如果一个insert_iterator
的底层迭代器(受保护的成员iter
)是否有效,受通常的迭代器失效规则的约束?
相关:std::insert_iterator 和迭代器失效给出了一个无效insert_iterator
的示例,但没有阐明规则。
如果其底层迭代器(受保护的成员迭代器)是insert_iterator有效,
你是对的,这就是规范中列出受保护成员的原因,并且在insert_iterator
上工作的功能(特别是operator=
,因为其余的都是无操作)是根据访问iter
的函数定义的
好吧,答案取决于您具体要问什么。
(为了解决这个问题,我想立即指出您的"相关"链接完全不相关。该链接处的代码问题与insert_iterator
失效完全无关。这个问题的作者误解了这个问题,最终试图解决一个不存在的问题,而真正的问题仍然存在。我也为这个问题提供了额外的答案。
如果您从有效的迭代器container::iterator it
创建insert_iterator ins
,然后独立地对容器执行某些操作,以使it
无效,则ins
也将失效。这是很自然的期待。如果您独立执行,ins
无法知道容器发生了某些事情。
但是,同时insert_iterator
用于插入时具有自我修复性能。例如,如果使用insert_iterator ins
将数据插入到vector
中,即使向量经过重新分配,ins
仍然有效。即,即使向量重新分配是一个大规模的迭代器无效事件,它也不会损害ins
(当然,假设重新分配是由通过ins
执行的插入触发的)。
这遵循标准插入算法
it = container->insert(it, value);
++it;
其中it
是存储在insert_iterator
中的基础插入点迭代器。前插入和后插入迭代器也具有相同的"自我修复"属性。可能无效的内部迭代器会立即重新验证。
为了说明差异,请考虑这个简单示例
std::vector<int> v(10);
std::vector<int>::iterator it = v.begin() + 5;
for (unsigned n = 20; n > 0; --n)
v.insert(it, rand());
此代码通常是无效的,因为容器很可能会在插入周期中重新分配,从而使it
无效并使所有进一步的插入无效。
同时此代码
std::vector<int> v(10);
std::vector<int>::iterator it = v.begin() + 5;
std::insert_iterator<std::vector<int> > it_ins(v, it);
for (unsigned n = 20; n > 0; --n)
*it_ins++ = rand();
保证正常工作,无论向量是否重新分配。
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 静态结构和一个定义规则
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 尽管遵循了规则,内存泄漏在哪里
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 生成文件:没有规则的依赖项不会使父项无效
- Bison:由于冲突,规则在解析器中无效[-Wother]
- insert_iterator无效规则
- 结束迭代器无效规则