remove_if 的效率测试

#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

}

}

状态函数能维护自己的状态(成员参数),而这里缺不能依赖对象的状态

原文地址:https://www.cnblogs.com/hustcpp/p/11014873.html