使用c++中的一些现成的容器操作精简代码

267 阅读1分钟

简介

学会用一些stl、boost提供的容器方法

  • 可以大大减少代码行数
  • 增强可读性
  • 提高性能

本文介绍一些常用的容器方法

count_if

  • 作用:当我们要判断一个容器里满足条件的元素数量,就可以用这个方法

  • 文档:www.boost.org/doc/libs/1_…

  • 官方解释:count_if returns the number of elements x in rng where pred(x) is true.

例如,当需要统计std::vector<int> list_里回文元素数量

常规的写法是:

bool is_palindrome(int element){
    string str1 = to_string(element), str2 = to_string(element);
    reverse(str1.begin(), str1.end());
    return str1 == str2;
};

int count = 0;
for (auto it = list_.begin(); it != list_.end(); it++) {
  if (is_palindrome(*it)) {
    count +=1;
  }
}

用count_if的写法:

auto is_palindrome = [](int element)
{
    string str1 = to_string(element), str2 = to_string(element);
    reverse(str1.begin(), str1.end());
    return str1 == str2;
};
int count = boost::range::count_if(list_, is_palindrome);

std::find_if(): 找到满足某条件的元素

  • 作用:find_if可以直接返回容器范围内满足条件的元素指针,省略了自己for循环遍历并if判断

例如,当需要找到std::vector<int> list_里第一个文元素

常规的写法是:

bool is_palindrome(int element){
    string str1 = to_string(element), str2 = to_string(element);
    reverse(str1.begin(), str1.end());
    return str1 == str2;
};

int count = 0;
int* p = nullptr;
for (auto it = list_.begin(); it != list_.end(); it++) {
  if (is_palindrome(*it)) {
    p = it;
    break;
  }
}
if (p != nullptr){
  //相关操作
}

使用find_if():

auto it = std::find_if(input.begin(), input.end(), is_palindrome);
if (it != input.end()) {
  //相关操作
}

remove_erase_if

if系列,遍历容器,把满足参数3返回值为true的元素删除,里面还能加入其他操作,下面有个例子:

boost::range::remove_erase_if(vec_docs_, [&output](const auto &doc) {
       if (doc->age > 10) {
           output.emplace_back(doc); 
           return true; 
       } 
       return false; 
});

相当于遍历vec_docs_里每一个doc,如果doc.age大于10就把他从vec_docs中删除,并加入output