概述
关联容器都不支持顺序容器的位置相关的操作,例如push_front或push_back。而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。
map
类似顺序容器,关联容器也是模板。为了定义一个map,我们必须指定关键字和值的类型。当从map中提取一个元素时,会得到一个pair类型的对象。简单来说,pair是一个模板类型,保存两个名为first和second的数据成员,map所使用的的pair用first成员保存关键字,second成员保存对应的值。关联容器的迭代器都是双向的。
定义关联容器
可以构造空容器,也可以拷贝构造,在新标准下可以对关联容器进行值初始化。例如:
set<string>exclude={"the","but"};
map<string, string>authors = { {"joyce","james"},{"Austen","jane"} };
multimap和multiset
map或者set中的关键字必须是唯一的,但是容器multimap和multiset就没有限制,他们都允许多个元素具有相同的关键字。例如:
vector<int>v1;
for (vector<int>::size_type i = 0; i < 10; ++i)
{
v1.push_back(i);
v1.push_back(i);
}
cout << v1.size();
set<int>s1(v1.begin(), v1.end());
multiset<int>m2(v1.begin(), v1.end());
cout << s1.size() <<" "<< m2.size();
会输出20 10 20;
使用关键字类型的比较函数
用尖括号指出要定义哪种类型的容器,自定义操作类型必须在尖括号中紧跟着元素类型给出。
例如:
class number
{
int a;
int b;
};
int main()
{
multiset<number>s1;
number one;
s1.insert(one);
}
这样就会报错。
比较操作类型是函数指针类型;例如
class number
{
public:
int a = 1;
int b = 2;
};
bool compare(const number& one, const number& two)
{
return one.a >= two.b;
}
int main()
{
multiset<number,decltype(compare)*>s1(compare);
number one;
one.a = 3;
one.b = 4;
s1.insert(one);
number two;
s1.insert(two);
for (auto num : s1)
{
cout << num.a << " " << num.b;
break;
}
}
这表示从compare来初始化s1对象,通过调用compare来为这些元素排序。