【问题标题】:std::vector erase() not working as intendedstd::vector erase() 没有按预期工作
【发布时间】:2018-11-09 06:58:48
【问题描述】:

我试图在迭代时从 OrderPair 向量中删除特定元素,但它并没有像我预期的那样工作。我正在尝试使用等于customer_Id 的id(第一个)删除每个OrderPair。我执行以下操作:

for(std::vector<OrderPair>::iterator i = source_Orders.begin(); i != source_Orders.end();)
{
      if((*i).first == customer_Id)
      {
          dest_Orders.push_back(*i);
          i = source_Orders.erase(i);
      }
      else
      {
          i++;
      }
 }
// definition of OrderPair
typedef std::pair<int, Dish> OrderPair;
// definition of OrderPair
enum DishType{
    VEG, SPC, BVG, ALC
};
// definition of OrderPair
class Dish{
private:
    const int id;
    const std::string name;
    const int price;
    const DishType type;
};

当迭代器指向一个符合if 条件的元素时(我可以在调试时看到它指向正确的元素),命令dest_Orders.push_back(*i); 正在按预期工作,那么我正在尝试删除我移动到dest_Orders 的元素,并继续进行下一次迭代。但是,结果是删除了向量 source_Orders 中的最后一个元素。

我在这里做错了什么?

提前致谢。

【问题讨论】:

标签: c++ vector


【解决方案1】:

有些东西你没有给我们看。

class Dish{
private:
    const int id;
    const std::string name;
    const int price;
    const DishType type;
};

我猜你最初得到一个错误,说你不能分配Dish,因为成员是const。所以你添加了一个什么都不做的赋值运算符。是的,它现在可以编译了。

不幸的是,vector 依赖于赋值运算符实际执行它在锡上所说的,因为当你擦除中间的东西时,它使用赋值来移动元素。

【讨论】:

  • 你是绝对正确的。那么我该怎么办呢?由于您提到的原因,我需要一个空的 operator=,所以它会始终如一地工作。
  • 不要将成员设为 const,或者不要使用vector。此外,赋值运算符应该进行赋值。
  • 我会这样做,但这是给我的课程,我不允许更改它。而且我假设对于具有 const 成员的类删除了 operator=(我得到的编译错误是 Dish 不存在 operator=),否则我不必实现一个空的。
  • 如果您无法更改它,那么您的选择是 a) 不使用 vector 或 b) 添加间接级别(例如,使用 pair&lt;int, shared_ptr&lt;Dish&gt;&gt;)。定义一个空的operator= 几乎从来都不是一个好主意。数据成员是不可变的,因此尝试修改它们不应该编译。
  • 不幸的是我必须使用向量和配对。这是大学里的工作。
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2021-10-19
  • 2020-03-18
相关资源
最近更新 更多