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 ++中的擦除插入习语?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 结构集无法按元素查找/擦除

字符数组 C 中的字符插入

c中的稀疏矩阵插入

插入到语句中的sql查询和c#中的错误

求C语言 数据结构中的链表创建,插入和删除代码

“插入'键'(a,b,c,d,e)值(?,?,?,?,?)”中的SQL语法错误[关闭]