2014-01-31 37 views
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); 

这种方法不起作用,所以我用清晰的代替。

+0

如果擦除元素,下一个元素将具有相同的索引。 (因此,减少索引或使用一段时间,只有在没有元素被擦除的情况下增加索引) –

+0

但是无论如何擦除一个元素一次是不必要的低效率。 –

+0

我没有使用C++ 11,所以我不能做很多我想要的声明。我使用清晰的,它删除了所有元素,但我想知道为什么擦除没有,即使我通过表中的每个元素循环。 – user3251195

回答

4

我不知道是什么choicek有,但要想删除从向量v这等于一个特定值val使用“擦除remove惯用法”的所有值:

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() 
     ); 
    } 
} 

如果您有平等问题变得更为复杂的情况下,代替使用。但是,在你的情况,涉及puzzle额外条件不使用循环变量h,所以我觉得你可以测试看在向量之前:

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

在C++ 03则无法使用“基于范围的循环“for (auto &row : table)。所以如果你没有C++ 11,或者你需要在puzzle测试中使用该索引,那么坚持使用for(int i = 0; i < 9; i++)

+0

为什么不是std :: for_each而不是基于索引的循环? – Joky

+0

@Joky:主要是因为提问者的代码适用于该部分。我只提到了基于范围的for循环,因为我想修改并粘贴我的擦除 - 删除代码,并保存了'auto&v = table [i] [k];'或类似的:-)另外,因为使用'for_each '需要编写一个独立的函数,但这是一个样式问题。就我个人而言,我认为它不会帮助将短循环体移出到源文件中的其他位置。 –

+0

我之前也不愿意std :: for_each为此之前的lambdas :) – Joky