effective STL
Posted HelloCsz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了effective STL相关的知识,希望对你有一定的参考价值。
1.标准序列容器 vector/deque/list/string
2.标准关联容器 set/map/multise/multimap
3.
连续内存容器(contiguous-memory container) string/vector/deque
基于节点容器(node-based container) list/set/map/multiset/multimap/hash_set/hash_map/hash_multiset/hash_multimap
4.迭代器
input iterator(istream_iterator)
output iterator(ostream_iterator)
forward iterator
bidirectional iterator
random access iterator
5.从属类型
typename
6.排序效率
partition> stable_partition? nth_element? partial_sort> sort> stable_sort
7.比较sort与qsort
sort默认比较方式为函数对象(判别式(纯函数))而qsort则是函数指针,区别在于sort函数对象是内联,在编译时用代码替换,
而函数指针则需要在调用时先保存状态然后调用函数.
8.纯函数
参数相同时不管何时调用都返回相同结果(bool operator()(T valA,T valB)const
加入const时,函数内变量默认const类型
bool operator()(int key) const { //std::set<int> data std::set<int>::iterator it= data.find(key); //error }
9.remove
std::vector<int> data; . . data.erase(std::remove(data.begin(),data.end(),val),data.end());
remove复杂度 std::distance(container.begin(),container.end())
erasef复杂度 线性(析构函数/删除变量),赋值运算操作删除变量后剩下element数量
10.容器成员函数与algorithm同名算法
成员函数通常比同名算法更快且结合更加紧密.标准关联容器(set/map)的find与algorithm find的释放方式不同,
成员函数find依据容器的实现(通常是红黑树)复杂度 log size(),而find线性查找.且STL算法以相等性判断两个对象
是否具有相同值而关联容器则使用等价性进行他们的相同性测试 !(a< b) && !(b< a)
list成员函数比同名algorithm算法性能更好,维护指针比拷贝对象开销小得多.list.sort()与sort(),sort要求参数为随机
迭代器而list只具有双向迭代器.
11.多线程环境中使用引用计数string
由避免内存分配和字符拷贝所节省下来的时间比不上花在背后同步控制上的时间
12.istreambuf_iterator
std::ifstream input_file("**.txt"); input_file.unsetf(std::ios::shipws); std::string file_data((std::istream_iterator<char>(input_file)),std::istream_iterator<char>());
istream_iterator内部使用operator>>函数实际上执行格式化的输入,这意味着你每次调用operator>>操作符,它都要执行
许多附加操作:一个内部的sentry对象的构造和析构(sentry是调用operator>>的过程中进行设置和清理行为的特殊iostream对象);
检查那些可能会影响其行为的流标志(如skipws);检查所有可能发送的读取错误;如果遇到错误,还需要检查输入流的异常屏蔽标志以
决定是否抛出响应异常.istreambuf_iterator<char>直接从流的缓冲区读取下一个字符(istreambuf_iterator<char>对象从一个输入流
istream s中读取下一个字符的操作通过s.rdbuf()->sgetc()来完成),不会跳过任何字符.
13.函数指针是按值传递
STL函数对象是函数指针的一种抽象和建模形式
14.要求排序区间的STL算法
binary_search lower_bound upper_bound equal_range merge inplace_merge includes
set_union set_intersection set_difference set_symmertric_difference
(unique/unique_copy)不要求排序区间但是它的现实是消除相邻相等element
std::vector<int,std::greater<int>> data; . . auto it= std::find(data.begin(),data.end());//默认std::less<int>
在使用STL算法是所采取的比较函数对象必须与容器排序所采取比较函数对象相同.
equal_range 比lower_bound开销更大,但lower_bound返回后还需要手工检测所返回是否是需要element,序列容器默认是相等性,
而关联容器是等价性如果是关联容器返回则需要 if(it!= container.end() && !(*it< val))
set/map检测element是否存在使用count
multiset/multimap 检测element是否存在使用find,find并非一定是第一个具有此值elemnt(使用lower_bound可以达到此功能,但
需要手动检测等价性)
15.inserter/back_inserter/front_inserter
inserter返回inserter_iterator对象,此对象包含一个iter记录下一次插入的位置,在operator*运算函数中调用源对象的inserter函数并记录返回iterator.
back_inserter返回back_inserter_iterator对象,在operator*运算函数中调用源对象back_inserter
front_inserter返回front_inseter_iterator对象,在operator*运算函数中调用源对象front_inserter
16.关联容器比较函数在等值时返回false(等价性)
std::set<int,std::less_equal<int>> data; data.insert(10); data.insert(10); //成功,但破坏了容器内部数据结构 std::multiset<int,std::less_equal<int>> multi_data; mutil_data.insert(10); mutil_data.insert(10); auto it= mutil_data.equal_range(10); //!(10<= 10) && !(10<= 10) if (it.first== it.second) { std::cout<<"error\n"; }
以上是关于effective STL的主要内容,如果未能解决你的问题,请参考以下文章