引入

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()
}

更多推荐