简介
学会用一些stl、boost提供的容器方法
- 可以大大减少代码行数
- 增强可读性
- 提高性能
本文介绍一些常用的容器方法
count_if
-
作用:当我们要判断一个容器里满足条件的元素数量,就可以用这个方法
-
官方解释: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