下面是看Effective STL过程总结的一些比较常用的STL算法。
关于Effective STL的总结请看这里点击打开链接。
注意:
1. 对某些容器来说,执行某些操作后可能使当前的迭代器、指针和引用失效,这一点要特别注意,Effective STL P36 第9 条谈到这一点。
2. 使用reserve成员函数改变当前容量以减少内存重新分配次数。
3. (第17条)使用swap技巧除去多余容量。不过C++11已经添加了shrink_to_fit方法支持该操作。
4. (第18条)vector<bool>并不是一个容器,不能对单个元素进行取地址的操作。最好使用deque<bool>或bitset替代vector<bool>。
5. (第21条)保证关联容器(set, multiset, map, multimap)的比较函数在等值情况下返回false
std::set:set模板参数中的Compare必须是个类型,不能是函数指针,也就是必须为一个重载了operator()的class或struct。
std::less_equal:比较函数模板
std::copy:很强大的函数
back_inserter:插入到容器后面,与copy一起用
std::inserter:插入迭代器
std::vector::assign:vector 赋值操作,可以使用区间参数
std::istream_iterator:输入流迭代器
std::ostream_iterator:输出流迭代器
std::iterator_traits:得到容器参数类型,迭代器类型等信息
std::remove : 不改变容器大小
c.erase( remove(c.begin(), c.end(), badValue), c.end ); // c标准序列容器(vector, string, deque)时使用这种方法删除指定元素
std::list::remove :改变容器大小
c.remove(badValue); // list则使用成员函数更好
std::set::erase :关联容器不能用 remove 算法
c.erase(badValue); // c是标准关联容器时,使用erase成员函数最好
std::transform:强大的序列转换函数:
std::not1:将其参数函数子返回值取反,参数不能为函数指针,必须为一个函数对象,函数指针须用ptr_fun转换
std::not2:同上,只是参数函数对象含两个参数
std::ptr_fun:参看第41条
std::bind:C++11标准,绑定函数参数,参数可变
std::bind1st:C++99 标准,将元函数配接为一元函数,配接第一个参数
std::bind2nd:同,不过配接是第二个参数
std::accumulate:区间统计算法,可接自定义的统计函数。位于头文件 numeric中
std::multiplies:乘法函数模板,位于<functional>头文件中。
std::lower_bound:区间内第一个 >= 指定元素的位置
std::upper_bound:区间内第一个 > 指定元素的位置
std::equal_range:返回pair类型,由两个迭代器组成,一个是lower_bound返回值一个是upper_bound返回值。
std::binary_search:返回值为bool,只判断是否存在指定元素
std::count:返回区间内指定元素个数
std::distance:返回两个迭代器之间的元素个数