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";
}
时间: 2024-08-07 08:35:07

effective STL的相关文章

Effective STL 中文版(大全)

Effective STL 中文版(大全) 作者:winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL.Effective STL是一本非常好的书,帮助你更好的理解STL,其作者就是<Effective C++>一书的作者.如果你已经初步了解了STL的容器.迭代器.算法和函数,而又想更好的了解STL,那么<Effective STL>是你的最佳选择. 还有一部分没有找到链接,如果再找不到我会自己试着翻译一下:) 前言 容器 条款1

迅速读懂:Effective STL (五)

这是<Effective STL>笔记最后一期,不能涵盖全部内容,书后仍然有些附加内容,不在附加,有兴趣可以找原书来读读,一则是区域设置后的忽略大小写比较,另一则是MSVC4-5编译器下STL注意事项 条款41:了解使用ptr_fun.mem_fun和mem_fun_ref的原因 函数和函数对象总使用用于非成员函数的语法形式调用.mem_fun带有一个到成员函数的指针,pmf,并返回一个mem_fun_t类型的对象.这是一个仿函数类,容纳成员函数指针并提供一个operator(),它调用指向在

Effective STL 第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉

STL中的容器相当"聪明",它们提供了迭代器,以便进行向后和向前的遍历(通过begin.end.rbegin等):它们告诉你所包含的元素类型(通过它们的value_type类型定义):在插入和删除的过程中,它们自己进行必要的内存管理:它们报告自己有多少对象,最多能容纳多少对象(分别通过size和max_size):当然,当它们自身被析构时,它们自动析构所包含的每个对象. 有了这么"聪明"的容器,许多程序员不再考虑自己做善后清理工作.更糟糕的是,他们认为,容器会考虑为

Effective STL读书摘要(一)

一直在用STL,认为对STL也有一些理解,比如比较函数怎么写,什么情况下用什么容器效率高,但是当你读过Effective STL之后才知道这远远不够,之前的代码还有很多可以优化的空间,下面我会罗列一些映像比较深的点,比较偏向代码因为这样可以方便以后的调用.这里是到Item29,余下的留下次看. 1) 检查容器是否为空 if(c.empty()){}   better than if(c.size()==0){} 2)如果能用批量操作函数就不要用循环来做 批量操作可以提高效率,要有能用批处理尽量批

C++学习书籍推荐《Effective STL(英文)》下载

百度云及其他网盘下载地址:点我 作者简介 Scott Meyers is one of the world's foremost authorities on C++, providing training and consulting services to clients worldwide. He is the author of the best-selling Effective C++ series of books (Effective C++, More Effective C+

effective stl(容器部分总结)

还是很喜欢effective部分的书,看了好几遍,这里把stl中和容器相关的一些基本的注意的点进行介绍总结,之后对迭代器等进行总结 1 对序列容器中需要逐个删除的时候,不能像关联容器那样事先对迭代器进行++操作,因为删除一个迭代器,会使他自己无效,后面的迭代器也无效,所以应该保存删除erase返回的下一个指针的值.而关联容器中并不会导致后面的迭代器无效的情况 2 在stl中如果对容器内对象使用了new操作,一定要释放掉,因为析构函数没办法完成,这里最好使用智能指针,但是不要使用auto_ptr的

Effective STL 条款1:仔细选择你的容器

条款1:仔细选择你的容器 了解各种容器的实现方法,知道各种容器的内存管理方式.各种操作所对应的底层操作,然后根据需要选择恰当的容器. 对于容器的分类: 标准STL序列容器:vector,string,deque和list 标准STL关联容器:set,multiset,map和multimap 非标准序列容器:slist(单向链表)和rope(重型字符串--不懂) 非标准关联容器:hash_set,hash_multiset,hush_map和hash_multimap vector == str

effective stl 条款18:避免使用vector&lt;bool&gt;

做为一个STL容器,vector<bool>确实只有两个问题.第一,它不是一个STL容器.第二,它并不容纳bool.除此以外,就没有什么要反对的了 . 在这些要求中有这样一条:如果c是一个T类型对象的容器,且c支持operator[],那么以下代码必须能够编译:T *p = &c[0]; // 无论operator[]返回什么,// 都可以用这个地址初始化一个T*换句话说,如果你使用operator[]来得到Container<T>中的一个T对象,你可以通过取它的地址而获得

Effective STL 条款3

确保容器中的对象拷贝正确而高效 在使用STL模板的时候,我们必须想到有关拷贝的问题.如果STL中存储的是我们自定义类型.可能会发生以下几个问题: 首先 为了避免拷贝过程成为程序运转的瓶颈,我们选择存储自定义的指针.但是,这里容易出现野指针的问题,所以我们需要使用智能指针shared_pre来避免. 接着 如果存储类型为基类,此时我们存储派生类,则会发生截断现象,即只copy了基类部分,而派生类部分丢失. 最后 相对于数组来说,vector有它独到的有点,最明显的就是长度的动态增长.