如果我有一个声明为
的向量表 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);
}
}
}
我认为这样可行,但我不是百分之百,因为我试图使用这种技术删除每个元素并且它不起作用,对于那些想看到我用来删除所有元素的代码的人,那就是:
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 :(得分:4)
我不知道choice
和k
是什么,但要删除矢量v
中等于特定值val
的所有值,请使用“擦除 - 删除成语“:
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
}
在C ++ 03中,您不能使用“基于范围的for循环”for (auto &row : table)
。因此,如果您没有C ++ 11,或者您需要在puzzle
测试中使用该索引,那么请坚持使用for(int i = 0; i < 9; i++)
。