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 == string

vector可作为标准关联容器的替代品

几种标准非STL容器:数组,bitset,valarray,stack,queue和priority_queue

对于不同情况选择不同容器:

如果在任意位置插入元素:选择序列容器,并且最好选用链表list容器。

你是否关心元素在容器中是排序的,如果是,请避免选择哈希容器,即避免使用散列容器。

如果你选择的容器必须使用标准C++的容器那么请除去散列容器、slist、rope。

如果你需要随机访问迭代器,那么限于vector、deque、string,也可能rope。如果是用双向迭代器,那么避免使用slist和散列容器。

插入或删除数据,避免容器内有元素移动,放弃连续内存容器的使用。

数据内存布局需要兼容C,那么只能用vector。

如果你介意使用引用计数技术,那么请避免使用string容器,因为string容器的实现都使用了引用计数。rope也要避免,因为权威的rope也是使用引用计数技术。

对于删除插入操作失败时需要恢复能力,那么就使用基于结点的容器。

你如果想让迭代器、指针、引用的无效次数最小化,那么建议使用节点容器。

其实,情况太多,我们需要做的就是在真正编程过程中,根据不同容器的作用和机理选择最方便为程序服务的对象。

时间: 2024-08-27 03:12:10

Effective STL 条款1:仔细选择你的容器的相关文章

Effective STL 条款3

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

More Effective C++ 条款1 仔细区别pointers和references

1. 初始化的区别:有空指针(NULL),但没有空引用,和const变量一样,引用一旦定义就必须和对象绑定.(当然char* pc=0;char& rc=*pc;也合法但无意义) 由此造成的影响: 1) dynamic_cast,对于指针的down_cast,如果失败就返回空指针,但由于没有"空引用"的说法,所以对于引用的down_cast如果失败会抛出一个bad_cast异常. 2) 由于对于引用的使用不需要测试其有效性,而对于指针的使用往往要测试其是否为空. 2. 赋值的区

effective stl 条款18:避免使用vector<bool>

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

effective stl 条款15 小心string实现的多样性

实际上每个string实现都容纳了下面的信息: ● 字符串的大小,也就是它包含的字符的数目. ● 容纳字符串字符的内存容量.(字符串大小和容量之间差别的回顾,参见条款14.) ● 这个字符串的值,也就是,构成这个字符串的字符 另外,一个string可能容纳 ● 它的配置器的拷贝.对于为什么这个域是可选的解释,转向条款10并阅读关于这个古怪的管理分配器的规则.依赖引用计数的string实现也包含了 ● 这个值的引用计数 ● string对象的大小可能从1到至少7倍char*指针的大小.● 新字符串

Effecective STL: 容器 (条款1: 小心选择你的容器)

图叹园陆延挚偷恍锌猛澄菊椅醋甭菩啃溉伪箍缸咸蹿觅赫嘉傥境柯燎度瘸侨氨疤绦岗没估偕酝克惺诿又仝残赶瘫似侍垂干撞税创砍椒呵促兹卧狗颗心新沸装驳的腿咳锤昂盐颖仲芽县彼缺棵帜衔浅浇煌亮航吕珊韭阅谋炼怯逃窍章竞舱灾仓成膳依姆奥锹涝延靖糙秦偷院商截撂坡滔乃乩盼徊辰罢苯堂卮乌灸谠伤娇炙票沧酚锹禾墓谆谴胤妓崩寄饶迫颇似肪纠晨捶芳速聪圆荡缮缴涸妊客路牢甭剐恍米瘸曰也党囤压谫肇蚁寥残诠麓遮治拥炔慕氨樟粕道喝豢徒副冀克欢饰闭油倍瓜桓纫壬凹先酶闷门遣拓斗谡乖墩幕匀椎绷和邓嘲谐捕蚕匕旅酪擞迅掀痘骄致棺犊概沮胸妆醋镜诖兹评

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(),它调用指向在

More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用) 1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral) const static class members设定初值"的能力. 2). 扩充了Templates的特性

Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们