我有一个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());
答案 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/。在你的代码中还有许多值得讨论的事情。