std :: vector erase () не работает должным образом - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь стереть определенные элементы из вектора OrderPair во время итерации, но это не работает так, как я ожидаю. Я пытаюсь удалить каждый OrderPair с id (первым), равным customer_Id. Я делаю следующее:

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.

Что я здесь не так делаю?

Заранее спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Есть что-то, что вы нам не показываете.

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

Я предполагаю, что вы изначально получили сообщение о том, что вы не можете назначить Dish, потому что члены const. Итак, вы добавили оператор присваивания, который ничего не делает. Да, теперь он компилируется.

К сожалению, vector зависит от того, действительно ли оператор присваивания выполняет то, что говорит на жестяной банке, потому что он использует присваивание для перемещения элементов, когда вы стираете что-то в середине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...