正确地从矢量中删除元素

时间:2014-01-31 10:15:21

标签: c++ vector

如果我有一个声明为

的向量表

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。

1 个答案:

答案 0 :(得分:4)

我不知道choicek是什么,但要删除矢量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++)