使用OR运算符将多个for循环组合成一个

时间:2015-06-16 13:28:50

标签: c++ if-statement for-loop

这可能是一个简单的问题,但我无法让它发挥作用。我已经搜索并尝试了人们为OR运算符提供的所有建议,但我的代码却没有正确使用它。

所以这就是我所拥有的:我的代码的这一部分查看了一个向量(目前约有20,000个条目,但后来将有数百万个)并删除包含关键字的所有元素:“event”,“ / event“,”rwgt“和”/ rwgt“。当我使用四个for循环时,它完全正常,每个关键字一个,如下所示:

for (int j = 0; j< myvec.size()-1;j++) {

    if(myvec[j] == "  <event>") {    //erase all instances of "<event>"
        myvec.erase(myvec.begin()+j);
    }
}

for (int j = 0; j< myvec.size()-1; j++) {

    if(myvec[j] == "  </event>") {   //erase all instances of "</event>"
        myvec.erase(myvec.begin()+j);
    }
}

for (int j = 0; j< myvec.size()-1; j++) {

    if(myvec[j] == "  <rwgt>") {   //erase all instances of "<rwgt>"
        myvec.erase(myvec.begin()+j);
    }
}

for (int j = 0; j< myvec.size()-1; j++) {

    if(myvec[j] == "  </rwgt>") {   //erase all instances of "</rwgt>"
        myvec.erase(myvec.begin()+j);
    }
}

然而,这在计算上相当昂贵(现在只需要几分钟,只有20,000个条目;当我们达到数百万时,我无法想象它!)所以我想将所有四个关键字组合成一个for循环使用|| (OR)运算符如此:

for (int j = 0; j< myvec.size()-1;j++) {

if(myvec[j] == "  <event>" || myvec[j]  == "  </event>" || myvec[j] == "  <rwgt>" || myvec[j] == "  </rwgt>") {  //erase all instances of "<event>"
    myvec.erase(myvec.begin()+j);
}
}

然而,这比原来的4个循环花费的时间更长,并且它最终给我一个分段错误(核心转储)错误,据我所知,这意味着向量现在是空的。

有没有人对如何解决这个问题有任何想法?

提前致谢!

3 个答案:

答案 0 :(得分:3)

您可以使用functorstd::remove_if()来执行此操作。

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


struct removeTag
{
    bool operator()(const std::string& tag) const
    {
        return tag == "  <event>" || tag == "  </event>" || tag == "  <rwgt>" || tag == "  </rwgt>";
    }
};

int main()
{
    std::vector<std::string> data = { "  <event>", "  </event>", "  <rwgt>", "  </rwgt>" };
    auto it = std::remove_if(data.begin(), data.end(), removeTag());
    data.erase(it, data.end());
    std::cout << data.size();
    std::cin.get();
    return 0;
}

输出继电器:

0

答案 1 :(得分:2)

使用erase-remove idiom。

myvec.erase(
    std::remove_if(myvec.begin(), myvec.end(), [](std::string const &e) {
      return e == " blabla" || e == "blasd";
    }), myvec.end());

答案 2 :(得分:1)

我尝试了你的代码,在我替换

之后它运行良好
for(int j = 0; j < myvec.size()-1; j++)

for(int j = 0; j < myvec.size(); j++)

myvec.erase(myvec.begin() + j);

myvec.erase(myvec.begin() + j--);

我的Testprogramm看起来像这样:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
   vector<string> myvec = {"<event>", "nichts", "</event>", "<rwgt>", "</rwgt>"};

   for (int j = 0; j < myvec.size(); j++) {

       if(myvec[j] == "<event>" || myvec[j] == "</event>" || 
             myvec[j] == "<rwgt>" || myvec[j] == "</rwgt>") {   

          myvec.erase(myvec.begin() + j--);
       }
   }

   for(int i = 0; i < myvec.size(); i++) {
      cout<<myvec[i]<<endl;
   }
   return 0;
}