这可能是一个简单的问题,但我无法让它发挥作用。我已经搜索并尝试了人们为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个循环花费的时间更长,并且它最终给我一个分段错误(核心转储)错误,据我所知,这意味着向量现在是空的。
有没有人对如何解决这个问题有任何想法?
提前致谢!
答案 0 :(得分:3)
您可以使用functor和std::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;
}