#include <iostream> #include <functional> #include <vector> #include <algorithm> #include <chrono> using namespace std; vector<char> data; void init(){ int i = 10000; while(i--){ data.push_back('a'); data.push_back('b'); data.push_back('c'); } } void test1(){ for(auto it = data.begin();it!=data.end() ;){ if(*it == 'b'){ data.erase(it); }else{ ++ it; } } void test2(){ data.erase(remove_if(data.begin(),data.end(),[](char c){return c = 'b';}),data.end()); } int main(int argc, char * argv[]){ init(); auto start = chrono::system_clock::now(); if(*argv[1] == '1'){ test1(); }else{ test2(); } auto medium = chrono::system_clock::now(); chrono::duration<double> dur = medium - start;
std::cout << "spend " << dur.count() <<" ";
return 0;
}
# ./a.out 1
spend 0.0281981
# ./a.out 2
spend 0.0020453
1W * 3个数据, remove_if 的快些
另外看到一个小细节,上面使用的是匿名函数做stl算法的谓词函数, 有些使用我们使用对象函数作为谓词时,需要注意不同的平台可能实现不同,有的是传值,有的是传引用
class test{
bool operator (){
// compare
}
}
状态函数能维护自己的状态(成员参数),而这里缺不能依赖对象的状态