Правильное удаление элемента из вектора

0

Если у меня есть таблица векторов, объявленная как

vector<int> table[9][9] и я хочу сравнить и удалить элемент, если он уже существует, будет ли удаление:

for(int row = 0; row < 9; row++)//erases the current choice from the whole row
 {
   for(int h = 0; h < (int)table[row][k].size();h++)
   {
     if(table[row][k][h] == table[i][k][0])
     {
       table[row][k].erase(table[row][k].begin() + h);
      }
    }
  }

Я думал, что это сработает, но я не на 100%, потому что я пытался удалить каждый элемент, используя эту технику, и это не сработало, для тех из вас, кто хочет видеть код, который я использовал для удаления всех элементов, является:

for(int i = 0; i < 9; i++)
for(int k = 0; k < 9; k++)
      for(int n = 0; n < table[i][k].size();n++)
        table[i][k].erase(table[i][k].begin + n);

этот метод не работал, поэтому вместо этого я использовал clear.

  • 0
    Если вы удалите элемент, следующий элемент будет иметь такой же индекс. (Следовательно, уменьшайте индекс или используйте время и увеличивайте индекс, только если ни один элемент не удален)
  • 0
    Но в любом случае стирание одного элемента за раз излишне неэффективно.
Показать ещё 2 комментария
Теги:
vector

1 ответ

4

Я не знаю, какой choice и k есть, но чтобы стереть все значения из вектора v, которые равны определенному значению val используйте "erase-remove idiom":

v.erase(
    std::remove(v.begin(), v.end(), val),
    v.end()
);

Следовательно, сделать то же самое для всех векторов в table:

for (auto &row : table) {
    for (auto &v : row) {
        v.erase(
            std::remove(v.begin(), v.end(), val),
            v.end()
        );
    }
}

Если у вас более сложное условие, чем равенство, используйте remove_if вместо remove. Но в вашем случае дополнительное условие, связанное с puzzle, не использует переменную цикла h, поэтому я думаю, что вы можете проверить это, прежде чем смотреть в вектор:

if (puzzle[row][k] == 0) {
    // stuff with erase
}

В С++ 03 вы не можете использовать "диапазон для циклов" for (auto &row: table). Поэтому, если у вас нет С++ 11 или вам нужен индекс для использования в тесте puzzle, тогда придерживайтесь for(int я = 0; я < 9; i++).

  • 0
    почему бы не std :: for_each вместо цикла на основе индекса?
  • 0
    @Joky: в основном потому, что у спрашивающего есть код, который работает для этой части. Я только упомянул основанный на диапазоне цикл for, потому что я хотел вырезать и вставить свой код удаления-удаления без изменений, и он сохранил запись auto &v = table[i][k]; или аналогичный :-) Также, потому что использование for_each требует написания отдельного функтора, но это проблема стиля. Лично я не думаю, что это помогает читаемости переместить тело короткого цикла в другое место в исходном файле.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню