【STL——map与multimap容器】
·
引入
set 是 C++ STL 中的关联容器【map容器中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)】。
存储唯一键值,自动排序(默认根据元素的键值升序排列)。基于红黑树实现,插入、删除、查找时间复杂度为 O(log n),优点是可根据key值快速找到value值。
与上篇set与multiset
相似,除了multimap允许有重复键值,其他特性与 set 一致。
- pair对组
pair只含有两个元素,可以看作是只有两个元素的结构体。对于成
对出现的数据,利用对组可以返回两个数据。(自定义时输入两个元素,输出也是两个元素,可理解为每条数据都成对存在)。
标准头文件 #include
vs里面,某些编译器可以不声明这个头文件而直接使用,貌似在
C++中,pair被放入了std命名空间中了。
pair初始化
void test() {
//构造函数:默认、复制、运算符重载
pair<int, int>p;
pair<int, int>p1(p);
pair<int, int>p2 = p1;
//类似于STL创建新容器一样创建pair也可直接用
pair<int, int>p(10, 20);
map<char, int>m;
m.insert(pair<char, int>('a', 10));
//make_pair
m.insert(make_pair('q', 9));
//value_type
m.insert(map<char, int>::value_type('r', 5));
}
pair数据访问

make_pair
如上第二种写法:通过make_pair生成我们的所需要的pair
对于一般的pair而言,如果需要对其进行赋值,则需要分开赋值:
pair<int, int>p1;
p1.first =11,p1.second = 22;
使用make_pair方法可一步完成初始化:
pair<int, int>p1;
p1 = make_pair(11, 22);
使用make_pair不仅仅让我们免去了对两个变量进行分开来的访问赋值,同时make_pair也智能的接受变量的类型,不需要再度指定,也就是说,make_pair本身是接受隐式类型转换的,比如定义的是一个int类型,使用make_pair传入一个float类型的参数,make_pair不会报错,而是回自动的进行一个类型转换,将float变为int。
map的构造与赋值

void printMap(map<int,int>& m) {
for (auto i = m.begin(); i != m.end(); i++) {
cout << "key="<< i->first<<" "<<"value="<<i->second<<endl;
}
cout << endl;
}
void test() {
map<int, int>m; //默认构造
m.insert(pair<int, int>(1,20));
m.insert(pair<int, int>(9,90));
m.insert(pair<int, int>(2,40));
m.insert(pair<int, int>(4,80));
printMap(m); //自动排序输出:key=1 value=20 key=2 value=40……
map<int, int> m2(m); //拷贝构造
printMap(m2);
map<int, int> m3; //赋值构造
m3 = m2;
printMap(m3);
}
map容器的大小与交换

map<int, int>m; //默认构造
m.insert(pair<int, int>(1,10));
m.insert(pair<int, int>(9,90));
printMap(m); //自动排序输出:key=1 value=10 key=9 value=90
cout <<"m的大小是:" << m.size() << endl; //输出:2
cout << m.empty() << endl; //此时不为空,判断为假,输出:0
map<int, int>m1{ {10,20} ,{40,30} };
m1.swap(m);
printMap(m); //交换,输出的m为m1的内容
map容器的插入与删除

map<int, int>m; //默认构造
m.insert(pair<int, int>(1,10));
m.insert(make_pair(2, 20));
m.insert(map<int, int>::value_type(3, 30));
m[4] = 40;
printMap(m);
m.erase(m.begin());//删除开头
printMap(m);
m.erase(3); //删除key为3的元素
printMap(m);
m.clear(); //全部删除,等同于m.erase(m.begin(), m.end());
printMap(m);
map容器的查找与统计

map<int, int>m;
m.insert(pair<int, int>(1,10));
m.insert(make_pair(7, 60));
m.insert(make_pair(2, 20));
if (m.find(7) != m.end()) {
int pos = 0;
for (auto i = m.begin(); i != m.find(7); i++, pos++) {}
cout << "找到了,位置在:" << pos+1 << endl;
}
else {
cout << "未找到" <<endl;
}
cout<< m.count(3); //输出0
Multimap容器
Multimap是map映射容器的一种,其拥有map的全部内容,并在此基础上multimap还具有可重复保存元素的功能,与上文的multiset差不多,任何进行访问单个值的语句均只会返回第一个位置。
是否可以实现一个key值能够对应多个value,产生一种像一个学生有多门考试成绩的映射?
map中通过key得到value产生一一对应,那么multimap在此基础上使得map元素可以重复,因此这种情况可以使用multimap。
添加操作
multimap<string, int> m_map;
string name = "XiaoMing"; //以下传入同一学生的不同数据
m_map.insert(make_pair(name, 50));
m_map.insert(make_pair(name, 55));
m_map.insert(make_pair(name, 60));
m_map.insert(make_pair("zhangsan", 30));
//查找name并打印相关数据
int k;
multimap<string, int>::iterator m;
m = m_map.find(name);
for (k = 0; k != m_map.count(name); k++, m++)
cout << m->first << "--" << m->second << endl;
删除操作
void test() {
map<char, int>m;
m.insert(pair<char, int>('a', 10));
m.insert(make_pair('q', 9)); //常用
m.insert(map<char, int>::value_type('r', 5));
m.insert(make_pair('n', 1));
m.insert(make_pair('k', 4));
//指定值删除
m.erase('a');
//位置删除
m.erase(m.begin());
//区间删除
m.erase(m.begin(), m.end()); //等同于m.clear()
}
更多推荐
所有评论(0)