Если у меня есть таблица векторов, объявленная как
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.
Я не знаю, какой 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++)
.
auto &v = table[i][k];
или аналогичный :-) Также, потому что использование for_each
требует написания отдельного функтора, но это проблема стиля. Лично я не думаю, что это помогает читаемости переместить тело короткого цикла в другое место в исходном файле.