- 关联容器不支持顺序容器的位置操作,如push_back或push_front。
- 也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作。
11.2.1定义关联容器
定义一个map时,必须既指明关键字类型又指明值类型;而定义一个set时,只需指明关键字类型,因为set中没有值。
关联容器的初始化
每个关联容器都定义了一个默认构造函数,它创建一个指定类型的空容器。我们可以将关联容器初始化为另一个同类型容器的拷贝,或是从一个值范围类初始化关联容器,只要这些值可以转化为容器所需类型就可以。
//关联容器初始化
map<string, size_t> word_count; //空容器
//列表初始化
set<string> exclude={"The","But","And","Or","An","A",
"the","but","and","or","an","a"};
//三个元素,authors将姓映射为名
map<string, string> authors={{"Joyce","James"},{"Austen","Jane"},{"Dickens","Charles"}};
初始化multimap和multiset
map和set中的关键字必须是唯一的,即,对于一个给定的关键字,只能有一个元素的关键字等于它,容器multimap和multiset没有此限制。
#include<iostream>
#include<map>
#include<set>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<int> ivec;
for (vector<int>::size_type i = 0;
i != 10; ++i)
{
ivec.push_back(i);
ivec.push_back(i);//每个数重复保存
}
//iset包含来自ivec的不重复的元素;miset包含所有20个元素
set<int> iset(ivec.cbegin(), ivec.cend());
multiset<int> miset(ivec.cbegin(), ivec.cend());
cout << ivec.size() << endl;//打印出20
cout << iset.size() << endl;//打印出10
cout << miset.size() << endl;//打印出20
return 0;
}
11.2.2关键组类型的要求
对于有序容器–map、multimap、set以及multiset,关键字类型必须定义元素比较方法。在集合类型中,关键字类型就是元素类型;在映射中,关键字类型就是元素的第一部分。
11.2.3 pair类型
pair定义在utility中。
//pair类型
//它定义在头文件utility中,一个pair保存两个数据成员。pair是一个用来生成特定
//类型的模板
pair<string, string> anon; //保存两个string
pair<string, size_t> word_count; //保存一个string和一个size_t
pair<string, vector<int>> line; //保存string和vector<int>
//我们也可以为每个成员提供初始化器
pair<string, string> author{"James","Joyce"};
//创建pair对象函数
pair<string, int>
process(vector<string> &v)
{
//处理v
if(!v.empty())
return {v.back(), v.back().size()}; //列表初始化
else
return pair<string, int>(); //隐式构造返回值
}
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<int, string> a;
multimap<int, string> ma;
// key键 value值
a.insert(map<int, string>::value_type(1, "One"));
a.insert(map<int, string>::value_type(2, "Two"));
a.insert(map<int, string>::value_type(3, "Three"));
a.insert(make_pair(-1, "Minus One"));
a.insert(pair<int, string>(1000, "One Thousand"));
a[1000000] = "One Million";
cout << "map里一共有" << a.size() << "个key-value数据" << endl;
cout << "这些数据是:" << endl;
map<int, string>::const_iterator i;
for (i = a.begin(); i != a.end(); ++i)
{
cout << "key: " << i->first << " ";
cout << "Value: " << i->second.c_str();
cout << endl;
}
ma.insert(multimap<int, string>::value_type(3, "Three"));
ma.insert(multimap<int, string>::value_type(45, "Forty Five"));
ma.insert(make_pair(-1, "Minus One"));
ma.insert(pair<int, string>(1000, "One Thousand"));
ma.insert(pair<int, string>(1000, "One Thousand"));
cout << endl << "multimap里有" << ma.size() << "个数据." << endl;
multimap<int, string>::const_iterator im;
for (im = ma.begin(); im != ma.end(); ++im)
{
cout << "Key: " << im->first<<" ";
cout << "Value: " << im->second.c_str();
cout << endl;
}
return 0;
}