c++ - 为什么 vector::erase 似乎会导致崩溃?

标签 c++ loops for-loop vector erase

first1.erase(std::next(first1.begin(), i));删除了第二个循环,它有点奇怪,因为 first2.erase(first2.begin() + 4, first2.end());工作正常

#include <iostream>
#include <vector>

int main ()
{
    std::vector<int> first1 = {0,1,2,3,4,5};
    std::vector<int> first2 = {0,1,2,3,4,5};
    std::vector<int> second;
    std::vector<int> third;

    for(size_t i = 4; i < first1.size(); ++i){
      auto child = first1[i];
      second.push_back(child);
      first1.erase(std::next(first1.begin(), i));
    }

    third.assign(first2.begin() + 4, first2.end());
    first2.erase(first2.begin() + 4, first2.end());

    std::cout << "Size of first: " << int (first1.size()) << '\n';
    std::cout << "Size of second: " << int (second.size()) << '\n';
    std::cout << "Size of first: " << int (first2.size()) << '\n';
    std::cout << "Size of third: " << int (third.size()) << '\n';
    return 0;
}

输出:
Size of first1: 5
Size of second: 1
Size of first2: 4
Size of third: 2

我期待 first1/secondfirst2/third 相同

你可以在这里测试http://cpp.sh/9ltkw

最佳答案

在循环的第一次迭代之后

for(size_t i = 4; i < first1.size(); ++i){
  auto child = first1[i];
  second.push_back(child);
  first1.erase(std::next(first1.begin(), i));
}
i将等于 5并且 first1.size() 也将等于 5。因此只有 vector 的一个元素被删除。

你可以像这样重写循环
for(size_t i = 4; i != first1.size(); ){
  auto child = first1[i];
  second.push_back(child);
  first1.erase(std::next(first1.begin(), i));
}

得到预期的结果。

在这些陈述中
third.assign(first2.begin() + 4, first2.end());
first2.erase(first2.begin() + 4, first2.end());

有分配和删除2个元素。

关于c++ - 为什么 vector::erase 似乎会导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59458649/

相关文章:

c++ - 将重复计时器附加到不同的代码库

c++ - Cocoa 小部件的名称及其 Qt 等效项

c# - 多次循环DataTable

python - 嵌套 for 循环 : why is the inner loop only executed once?

Python遍历对象属性

c++ - 动态实例化和初始化结构

c++ - 如何使用 QString 数组调用 QMetaMethod?

java - 为什么/如何将整数设置为 -1 使我的 while 循环工作?

JavaScript - 石头剪刀布 - 用户输入不被确认

python - 为什么我的 for 循环没有在这段代码中迭代?