5、multimap
该标准关联容器是一个定义在 namespace std 中的模板,该模板的原型声明在头文件 <map> 中。multimap 除了元素对的关键字不必须唯一外,其他与 map 相同。
6、set
该标准关联容器是一个定义在 namespace std 中的模板,该模板的原型声明在头文件 <set> 中。 set 可以被视为只有关键字(注:Hash table, storing keys only)而没有相关的映射值的 map,因此 set 的用户接口也发生了微小的变化,即成员类型中没有:
typedef Key value_type;
typedef Cmp value_compare
操作中没有元素的下标访问操作。
7、multiset
该标准关联容器是一个定义在 namespace std 中的模板,该模板的原型声明在头文件 <set> 中。multiset 除了元素不必须唯一外,与 set 相同。
除了各容器都有的函数外,还支持以下成员函数:设m表容器,k表键值
m.find(k):如果容器中存在键为k的元素,则返回指向该元素的迭代器;如果不存在,则返回end()值。
m.lower_bound(k):返回一个迭代器,指向键不小于k的第一个元素;
m.upper_bound(k):返回一个迭代器,指向键大于k的第一个元素 ;
m.count(k):返回m中k的出现次数
插入元素用 insert
附:pair模板
pair模板类用来绑定两个对象为一个新的对象,该类型在<utility>头文件中定义。
pair模板类支持如下操作:
pair<T1, T2> p1:创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化
pair<T1, T2> p1(v1, v2):创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2
make_pair(v1, v2):以v1和v2值创建一个新的pair对象,其元素类型分别是v1和v2的类型
p1 < p2字典次序:如果p1.first<p2.first或者!(p2.first < p1.first)&& p1.second<p2.second,则返回true
p1 == p2:如果两个pair对象的first和second成员依次相等,则这两个对象相等。
p.first:返回p中名为first的(公有)数据成员
p.second:返回p中名为second的(公有)数据成员
multimap中的元素由 <关键字,值>组成,每个元素是一个pair对象。multimap 中允许多个元素的关键字相同。元素按照关键字升序排列,缺省情况下用 less<Key> 定义关键字的“小于”关系。
#include <set>
#include <iostream>
using namespace std;
int main() {
typedef set<double,less<double> > double_set;
const int SIZE = 5;
double a[SIZE] = {2.1,4.2,9.5,2.1,3.7 };
double_set doubleSet(a,a+SIZE);
ostream_iterator<double> output(cout," ");
cout << "1) ";
copy(doubleSet.begin(),doubleSet.end(),output);
cout << endl;
pair<double_set::const_iterator, bool> p;
p = doubleSet.insert(9.5);
if( p.second )
cout << "2) " << * (p.first) << " inserted" << endl;
else
cout << "2) " << * (p.first) << " not inserted" << endl;
return 0; }
输出:
1) 2.1 3.7 4.2 9.5
2) 9.5 not inserted
C、容器适配类
8、stack
栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则。
这个容器转接器是一个定义在 namespace std 中的模板,该模板的原型声明定义在头文件 <stack> 中。缺省情况下,用deque实现,用 vector和deque实现,比用list实现性能好。
stack 上可以进行以下操作:
push: 插入元素
pop: 弹出元素
top: 返回栈顶元素的引用
9、queue
队列。插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。
这个容器转接器是一个定义在 namespace std 中的模板,该模板的原型声明定义在头文件 <queue> 中。
和stack 基本类似,可以用 list和deque实现,缺省情况下用deque实现。同样也有push,pop,top函数但是push发生在队尾,pop,top发生在队头,先进先出。
10、priority_queue
优先级priority_queue队列。最高优先级元素总是第一个出列
该容器转接器是一个定义在 namespace std 中的模板,该模板的原型声明定义在头文件 <queue> 中。
和 queue类似,可以用vector和deque实现,缺省情况下用vector实现。priority_queue 通常用堆排序技术实现,保证最大的元素总是在最前面。即执行pop操作时,删除的是最大的元素,执行top操作时,返回的是最大元素的引用。默认的元素比较器是 less<T>。
#include <queue>
#include <iostream>
using namespace std;
int main() {
priority_queue<double> priorities;
priorities.push(3.2);
priorities.push(9.8);
priorities.push(5.4);
while( !priorities.empty() ) {
cout << priorities.top() << " "; priorities.pop();
}
return 0;
}
//输出结果:9.8 5.4 3.2
11、string
basic_string 是一个定义在 namespace std 中的模板,该模板的原型声明在头文 <string> 中。basic_string 提供了下标访问操作、随机访问循环字和一个容器的几乎所有的符号工具。不过 basic_string 不提供选择字符以外的其他类型作为容器的元素类型的功能。
12、valarray
valarray是一个定义在 namespace std 中的模板,该模板的原型声明在头文件 <valarray> 中。valarray 是一个用于优化数值计算的向量,但是不能试图将它作为一个通用容器。valarray 提供了许多有用的特定数值操作,然而对于标准的容器通用操作,它只提供了 size 和下标访问操作。用于 valarray 的循环子是随机访问循环子。
13、bitset
bitset是一个定义在 namespace std 中的模板,该模板的原型声明在头文件 <bitset> 中。在系统中经常用一个标志集合(这些标志指示一些如 good/bad, true/false 和 on/off 等双态值)来表示状态。bitset 通过产生一个 N 位的小集合和大量的相应的位操作为实现上述需求提供高效、方便的工具。bitset 提供的操作有两类,一类是对整个集合操作,而另一类是位操作。