C ++中的擦除插入习语?
Posted
技术标签:
【中文标题】C ++中的擦除插入习语?【英文标题】:Erase-Insert Idiom in C++? 【发布时间】:2020-09-21 07:52:26 【问题描述】:以下代码运行良好:
auto it = vec.insert(vec.begin(), vec.begin(), vec.begin()+i);
vec.erase(it+i, vec.end());
但这会产生malloc: corrupted top size
错误:
vec.erase(vec.insert(vec.begin(), vec.begin(), vec.begin()+i)+i, vec.end());
为什么会发生这种情况,有什么办法可以解决这个错误? 主要问题是,当两者都在同一个向量上操作时,我可以将 insert() 的结果传递给 erase() 吗?
【问题讨论】:
您真正想要实现什么?请添加示例 擦除删除 idom 起作用的原因是因为remove
实际上并没有从容器中删除元素。另一方面,insert
确实将元素插入到容器中
这段代码让我的蜘蛛感觉很刺痛,请不要...
第一个可能看起来工作得很好,但如果重新分配,所有insert
的参数都将变为无效。您无法通过测试来确定不存在未定义的行为。
【参考方案1】:
vec.end
在被评估为erase
的参数后,可能会因插入而改变。 C++ 不保证从左到右计算参数。
这里没有简单的解决方法。您需要 erase
的迭代器范围,但 insert
会更改 vector
的迭代器。
【讨论】:
“预留空间”是什么意思? @NotAProgrammer:好点,课程的结尾通过插入而改变,而不仅仅是基地址。 @Bingwen:vector.reserve
是一种确保向量有足够的容量添加新元素而不移动现有元素的方法。
可能值得补充的是,“erase-remove”是一个习语,“erase-insert”不存在,更不用说成语。
@MSalters 评估顺序是什么?如果不是从左到右以上是关于C ++中的擦除插入习语?的主要内容,如果未能解决你的问题,请参考以下文章