Effective Stl Note
jonson_zc
相信厚积薄发!
展开
-
不要试图编写独立于容器类型的代码
如果你想编写对大多数的容器都适用的代码,你只能使用它们的功能的交集。不同的容器是不同的,它们有非常明显的优缺点。它们并不是被设计用来交换使用的。原创 2015-10-12 09:53:11 · 363 阅读 · 0 评论 -
慎重选择容器类型
一、容器分类(1)标准的STL序列容器vector、string、deque和list。(2) 标准的STL关联容器set、multiset、map和multimap(3)非标准序列容器slist和rope。(4)非标准的关联容器hash_set、hash_multiset、hash_map和hash_multimap。(5)几种标准的非STL容器数组、bitset、valarray、stack、q原创 2015-10-12 09:50:40 · 367 阅读 · 0 评论 -
使用reserve来避免不必要的重新分配
(1)分配内存步骤关于STL,它们会自动增长以便容纳下你放入的数据,只要没有超出它们的最大限制就可以。对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。这个类似于realloc的操作有四个部分:**1. 分配新的内存块,分配的大小一般为当前容器内存的倍数。在大部分实现中,vector和string的容量每次以2的倍数为增长。即,当容器必须扩展时,它们原创 2015-10-12 10:28:17 · 1044 阅读 · 0 评论 -
慎重选择删除元素的方法
一、要删除容器中中有特定值的所有对象:(1)如果容器是vector、string或deque,则使用erase-remove习惯用法:c.erase(remove(c.begin(),c.end(),1963),c.end());(2)如果容器是list,则使用list::remove,此时remove是其成员函数:c.remove(1963);(3)如果容器是一个标准关联容器,则使用它的eras原创 2015-10-13 13:46:38 · 486 阅读 · 0 评论 -
用empty()来代替检查size()是否为空
对于任意容器c,if (c.size() == 0)...本质上等价于if (c.empty())...这就是例子。你可能会奇怪为什么一个构造会比另一个好,特别是事实上empty()的典型实现是一个返回size()是否返回0的内联函数。你应该首选empty()的构造,而且理由很简单:对于所有的标准容器,empty()是一个常数时间的操作,但对于一些list实现,size()花费线性时间。不管发生了原创 2015-10-12 09:58:04 · 1315 阅读 · 0 评论 -
vector和string优先于动态数组的分配
vector和string优先于动态数组的分配原创 2015-10-12 10:08:38 · 348 阅读 · 0 评论 -
使用swap技巧除去多余的容量
一、为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:vector<ElemType>(v).swap(v);vector(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原创 2015-10-13 14:15:21 · 659 阅读 · 0 评论