【问题标题】:I cant erase the elements from a vector properly我无法正确擦除矢量中的元素
【发布时间】:2014-05-02 05:05:37
【问题描述】:

所以我试图将向量 b 中的元素附加到向量 a 的末尾,同时擦除向量 b 中的所有内容。下面是我的代码,由于某种原因,擦除无法正常工作。感谢您的任何意见谢谢!!

void problem3(std::vector<int>& a, std::vector<int>& b){
    typedef std::vector<int>::iterator iter;
    int place_holder;
    for (iter i = b.begin();i !=b.end();i++){
        place_holder = *i;//use place hodler to store values temporairly 
        a.push_back(place_holder);//erase the elements from b
            b.erase(i);
        //std::cout<<b.size()<<'\n';
        //append at the end of a
    }
}

【问题讨论】:

  • 一个更好的主意是从循环中取出b.erase(i),然后在循环结束后擦除所有元素

标签: c++ pointers vector erase


【解决方案1】:

在循环中删除一个元素不是一个好主意,因为矢量大小是动态变化的,这很容易丢失正确的索引轨道。

相反,最后尝试擦除所有b 的元素:

b.clear();

P.S.: 有一种更简单的方法是使用 std::vector::insert() 将向量附加到另一个向量,因此您只需要:

a.insert( a.end(), b.begin(), b.end() );
b.clear();

【讨论】:

  • +1 放弃我的答案。我完全忘记了向量插入功能(显示我使用它的频率)。
  • 所以 insert() 需要三个参数?
  • @user3444882 它可以接受两个或三个参数。在这里,您需要使用需要 3 个的那个。
【解决方案2】:

这是因为您的迭代器在擦除时变得无效。 erase will return 你是指向下一个元素的迭代器,例如i = b.erase(i)。请注意,您要避免在 for 循环中使用 i++(或更好:++i),否则可能会跳过元素。

【讨论】:

  • 除此之外(完全明确),您需要将b.erase(i) 替换为i = b.erase(i)
  • @xcdemon05 如果这样做,循环条件也需要调整,因为你不想在之后做i++
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2012-03-30
  • 1970-01-01
相关资源
最近更新 更多