C ++ Vectors:根据特定列中的值删除行

时间:2015-09-03 10:56:14

标签: c++

我有一个2d数组(4x4)我需要根据最后一列中的特定值删除行,如果它包含字符串" NULL"然后应该删除整行。

post开始,我能够删除包含值" NULL"的任何行。以下是我的代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main ()
{
    vector< vector<string> > myVector;
        //m * n is the size of the matrix

    int m = 4, n = 4;

    //Grow rows by m
    myVector.resize(m);

    for(int i = 0 ; i < m ; ++i)
    {
        //Grow Columns by n
        myVector[i].resize(n);
    }

    //Now you have matrix m*n with default values

    //you can use the Matrix, now

    myVector[0][0] = "DC:86:D8:0F:EA:B8";
    myVector[0][1] = "NULL";
    myVector[0][2] = "1";
    myVector[0][3] = "NULL";

    myVector[1][0] = "18:F6:43:E7:ED:2E";
    myVector[1][1] = "1";
    myVector[1][2] = "1";
    myVector[1][3] = "-34";

    myVector[2][0] = "AC:81:12:57:12:50";
    myVector[2][1] = "1";
    myVector[2][2] = "1";
    myVector[2][3] = "NULL";

    myVector[3][0] = "00:C1:41:28:0B:6F";
    myVector[3][1] = "1";
    myVector[3][2] = "NULL";
    myVector[3][3] = "-23.5";


    for (int i =0; i<m; i++)
    {
        for (int j =0; j<n; j++)
        {


             cout<< myVector[i][j] <<"\t";

        }
        cout<<endl;
    }

    vector<vector<string> >::iterator row;
    vector<string>::iterator col;

for (row = myVector.begin(); row != myVector.end(); ) {

    bool delRow = false;
    for (col = row->begin(); col != row->end(); col++) {
        if (*col == "NULL") {
           delRow = true;
           break;
        }
    }    

    if (delRow) {
       row = myVector.erase(row);
    } else {
       ++row;
    }
}
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout<<endl;
    for (row = myVector.begin(); row != myVector.end(); row++)
    {
        for (col = row->begin(); col != row->end(); col++)
        {
            // do stuff ...cout << row;
            cout << *col <<"\t";
        }
        cout<<endl;
    }
    cout<<endl;
    cout<<endl;
    cout<<endl;
    cout << "The size is " << myVector.size();

       return 0;
}

如何更改上面的代码,使其仅在最后一列上进行迭代,如果列包含&#34; NULL&#34;则删除该行。我尝试使用for (col = row->end();;)但它不起作用。我也尝试使用帖子中建议的擦除删除习惯用法,但它给了我compilaton错误。

myVector.erase(
    std::remove_if(myVector.begin(), myVector.end(), [](const auto& row) {
        for(const auto& col : row){
           if(col == "NULL") { return true; }
        }
        return false;
    }), myVector.end());

1 个答案:

答案 0 :(得分:0)

在这里,你从前到后遍历行。

for (col = row->begin(); col != row->end(); col++) {
        if (*col == "NULL") {
           delRow = true;
           break;
        }
    }

而不是你应该只检查最后一列,如下:

vector<string>::reverse_iterator last = row->rbegin();
if( *last == "NULL"){
     delRow=true;
}

这在行上使用反向迭代器 - 即从后面开始的迭代器,如果你递增它,它将移动到前面。但由于您只想检查最后一个元素,因此无需对列进行for循环。如果您知道它将始终是 last 条目,即使在某些时候您在每行中有更多条目或不同长度的行,这是一个很好的解决方案。

另一种可能更通用的方法是使用if( (*row)[3]=="NULL")跟随注释中提到的那些行。但我建议将3硬编码到代码中。而是使用另一个变量(例如int colOfInterest = 3),然后使用它if( (*row)[colOfInterest]=="NULL")。像这样,如果突然你的感兴趣的列不是第三个,而是第一个你可以在一个地方改变它。当有人读你的代码时,很难理解为什么你在一个固定的地方有一个3并且有一个评论来解释这些事情也不是那么好 - 一个变量使它更明确(可能比我建议的更好的名字)也不会受到伤害)并且可以在代码的其他部分重用,如果在某些时候你碰巧关​​心同一列中的其他一些值。

如您所见,有不同的方法来处理您的问题,这一切都取决于“您前往的目的地”。这也是我写评论的原因,我建议你转到https://codereview.stackexchange.com/。在你的代码中还有许多值得讨论的事情。