Ponit1:
顺序容器:拥有有单一类型元素组成的一个有序集合:
1 Vector
2 List
3 Deque 类似Vector,但是对首元素删除,插入有特殊支持。
关联容器:
MAP 描述关键字(KEY)到有效数据(VALUE)映射。
SET 描述关键字的集合,有效支持关键字是否存在。
Point2:
如何选择Vectro还是list?
1 如果需要随机访问一个容器, 选择前者。
2 如果已知要存储的元素个数,选择前者。
3 如果不只是在容器两端插入和删除元素,选择后者。
4 如果我们不需要再删除插入首元素,则Vector比Deque好。
理论上对于动态增长的容器,理论上List增长比Vector效率高,但是实际并非如此,过程不多说,结论如下:
1 对于小对象,使用vector
2 对于大对象,使用List
Point3:
todo:
验证一下,如果定义一个vector容器的的数量为24的话,后续一直增加超过24,是否会报错?
每个容器支持一组关系操作符,比如> < 等,比较标准类似string
Point3:
迭代器:
iterator 对顺序或者关联容器的每个元素进行连续访问,每种容器都提供
begin() 返回一个iterator指向容器第一个元素。
end()返回指向interator指向容器最后一个元素的下一个位置。
todo:
迭代器的算术计算只适用于vector和deque,不能用于list,因为list是不连续的。
比如iter+=2,对于vector向后挪两个元素的位置,不能用list。
疑问:list容器的++操作符是否支持?
Ponit4:
我们可以把一个容器赋值给另一个,
比如slist1 = slist2,底层的操作时先释放slist1所有资源,然后再申请slist相同的资源,进行拷贝。
Point5:
泛型算法思想:
顺序容器的基本操作:插入,删除,赋值和对换,提供比较操作符。
毫无疑问,这个是一个相当小的接口,省略了find sort merge等基本操作。
泛型算法的思想是把所有容器的功能操作抽取出来,形成一个通用算法集合,它能应用到全部容器类型以及内置数组类型上。
而不是让所有容器都实现一把这些算法。
todo:标准C++库的使用说明,比如string的所有操作。
Point6:
Map容器:提供一个“key/Value”对,建用来索引map,而值用来存储和索引数据。
个人理解MAP容器扩展了数据下表的数据类型,之前只能是int,后续可以使string等
Point7:
高性能的插入MAP方法:
普通方法:
map<string,int> word_count;
word_count[string("apple")] = 1;
高性能方法:
word_count.insert(map<string ,int>::value_type(string("APPLE"),1));
map容器提供一个VALUE_TYPE方法构造一个方法对,直接插入。
通过下标操作插入容器的时候,首先是关联的值首先会调用默认的构造函数赋为初始值,然后再调用拷贝构造函数赋为新值。
个人理解C++提高效率的一个方法就是,不要调用无用的默认初始构造函数,比如上述插入方法:
又如下述的sting初始化,初始化2 优于初始化1
初始化1
string Name;
Name = string(“good day”);
初始化2
string Name = string(“good day”);
Point8:
Map危险做法:
任何一个不存在的key的下标操作和引起插入一个实例,其中的Value会初始为默认值。
判断一个Key是否存在不能使用上述下标操作,而使用如下方法:
1 count 2 find
Point9 :
Set容器:提供一些关键字的组合,Key的组合,提供某关键字是否存在查询:
提供insert find count iterator迭代等操作。
Point10:
栈
Point11:
堆