【问题标题】:Erase-Insert Idiom in C++?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 的参数都将变为无效。您无法通过测试来确定不存在未定义的行为。

标签: c++ vector stl malloc


【解决方案1】:

vec.end 在被评估为erase 的参数后,可能会因插入而改变。 C++ 不保证从左到右计算参数。

这里没有简单的解决方法。您需要 erase 的迭代器范围,但 insert 会更改 vector 的迭代器。

【讨论】:

  • “预留空间”是什么意思?
  • @NotAProgrammer:好点,课程的结尾通过插入而改变,而不仅仅是基地址。
  • @Bingwen:vector.reserve 是一种确保向量有足够的容量添加新元素而不移动现有元素的方法。
  • 可能值得补充的是,“erase-remove”是一个习语,“erase-insert”不存在,更不用说成语。
  • @MSalters 评估顺序是什么?如果不是从左到右
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多