1、顺序容器定义:按照在容器中的位置来顺序保存和访问; 关联容器:按照关键字来保存和访问;
2、关联容器分类:是否允许关键字重复— multi ,是否有序—ordered : map(关联数组,映射) set(集合) multimap multiset unoedered_map(哈希组织) ...
3、pair类型的对象,first second 公有成员,索引map会得到一个pair对象;
4、关联容器的迭代器都是双向的;
5、关联容器:支持默认初始化、同类容器赋值、列表初始化和 迭代器范围初始化(顺序容器的也可以);
6、对于有序容器:关键字必须定义比较的方法,默认使用“ < ”运算符,即要重载该运算符的类才能作为关键字,这个符号要保证“严格弱序”;
7、另一种方式,允许在定义集合或者映射的时候,给出谓词函数,用来完成比较,注意放在<>中,同时使用decltype(函数名)*来表达,构造函数传入该函数指针;
8、pair<string , string> 头文件 utility中, make_pair<v1,v2>返回一个v1和v2初始化的pair;
9、类型别名,set中 key_type = value_type ,map中,一个为关键字类型,mapped_type为值类型,value_type为pair类型;
10、map的value迭代器有读写功能,set的只读,关键字都是只读属性;
11、使用迭代器遍历时,默认按照升序排列;
12、关联容器一般不使用泛型算法,自己带的成员函数一般更加好用一些;
13、添加元素: insert(emplace)成员函数,可以是一个元素,迭代器范围,或者{}列表;
14、insert的返回值:不同参数的返回值不同,添加一个元素的返回一个pair,first为迭代器,指向插入的元素,second是bool类型,说明是否成功,如果已经有了,则会插入失败,返回false; 对于范围迭代器,返回void;
15、删除元素:erase,接收一个迭代器或者迭代器范围,返回void; 接收key值,删除全部key值,返回删除元素的数量;
16、下标操作map: [] 返回的是key-value的value,如果没有则会添加,和其他的很不一样; 如果没有,使用at()则会报错,注意允许重复关键字的无法使用;
17、查找:find,返回迭代器,指向第一个关键字为kef的元素,不成功返回尾后迭代器; count返回关键字等于key的数量;[] at;lower_bound upper_bound equal_range,返回一个迭代器,指向第一个关键字不小于k的、大于k的 关键字等于k的范围 的的迭代器或者迭代器pair;
18、对于multi map或者set 同样关键字的会连续存储;
19、对于无序容器,不是使用比较运算符来组织元素,而是使用hash函数来组织,在关键字没有明显顺序的情况下,无序容器用处比较大;
20、理论上,无序容器使用更加简单,同时经过简单的调试和测试,性能也会更好;
21、桶接口:bucket_count() 返回正在使用桶的数目;max_bucket_count()返回容器最多可以容纳桶的数量;bucket_size(N)第n个桶中存储的元素;bucket(k)k关键字在哪个桶中;
22、桶的迭代器; 哈希策略: load_factor()每个桶存储的平均数量;rehash(n)重新组织,reserve(n)...;
23、默认情况下,无序容器使用关键字的“==”的比较元素;
24、STL提供了内置类型、string和智能指针的hash,所以它们可以作为无序容器的key,但是自定义类型不能作为key;
25、自定义类型如果要做为无序容器的key,首先类要重载 == 运算符,或者写一个函数,然后还需要些一个hash函数,作为初始化无序容器的指针传递即可;