Sets和multisets有着相同的头文件<set>。默认set的元素默认以"<"排序,若要改成降序的在定义类型时可以:set<int, greater<int> > IntSet,注意两个">"之间有空格。Sets中的元素是以二叉树形式组织起来的,在读取的时候采用先根遍历。Multisets除了允许元素重复,和sets在使用上没什么区别。
Maps和sets的区别在于map处理的元素是一个key/value对,因此插入元素时要myMap.insert(make_pair(4,'a'));这类的操作,读取时则要iter ->second这类的操作,有些编译器不支持->因此要(*iter).second。
可以把map用作一个关联数组。如:
map<string, float> MyMap;
MyMap["Pi"] = 3.1415;//map插入元素的另一种方式
MyMap["Null"];//这种方式是合法的,赋默认值,这里是0
MyMap["Pi"] = 1;//当前map共有两个元素,第一个MyMap["Pi"]被覆盖。
multiMaps不能用作关联数组。
迭代器分为两类(书上说是两类categories,而不是classes,具体的我也不大明白,似乎前者只注重能力),一类是双向迭代器(Bidirectional iterator),一类是随机访问迭代器(Random access iterator)。他们之间的差别造成的原因是不同容器的实现不同,因此很容易理解为什么lists、sets、maps的迭代器是双向迭代器,而vectors、deques、strings的迭代器是随机访问迭代器。双向迭代器就是可以++,也可以--,而随机访问迭代器除了会++、--外,还可以随机访问、比较大小等。这也就解决了笔记(一)中的疑问:iter != A.end()可以作为所有容器的结束条件,而iter < A.end()只能用作随机访问迭代器。