关联式容器map、set的插入和删除操作

   在STL中,vector、list、deque等称为序列式容器,这些容器的底层为线性序列的数据结构,里面存储的是元素本身。而关联式容器存储的是结构的键值对,key和value是一一对应的关系。map、set、multimap、multiset均为树形结构,它们都是使用平衡搜索树作为其底层结构,容器中的元素是一个有序的序列。

一、map
map中的元素是按照键值key进行比较排序的,并且支持下标访问符,即每一个map[key]对应一个value,map中的key值是唯一的。
1、map的插入

void Test() {
	map m;
	map m1;
	
	//①、在map中插入键值对
	//插入键值对时,会按照键值key进行排序,默认从小到大
	m.insert(pair(3, 2));
	m.insert(pair(0, 6));
	m.insert(pair(4, 5));
	
	//②、在positon上插入键值对
	map ::iterator it = m.begin();
	m.insert(it, pair(2, 6));
	
	//③、在map中插入[first,last)之间的元素
	m1.insert(m.begin(), m.end());
	
	for (auto & e : m) {
		cout << e.first << "-->" << e.second << endl;
	}
	for (auto & e : m1) {
		cout << e.first << "-->" << e.second << endl;
	}
}

2、map的删除

void Test() {
	map m;
	m['a'] = 10;
	m['b'] = 20;
	m['c'] = 25;
	m['d'] = 23;
	m['e'] = 24;
	m['f'] = 26;

	map ::iterator it = m.begin();
	//①、删除position上的键值对
	m.erase(it);
	
	//②、删除键值为key的键值对
	m.erase('c');
	
	//③、删除[first, last)之间的元素
	it = m.find('d');
	m.erase(it, m.end());
	
	for (auto & e : m) {
		cout << e.first << "-->" << e.second << endl;
	}
}

multimap和map的区别:multimap中的key值可以重复,map的key值不能重复。
二、set
在set中,元素的value也能标识它,并且每个value是唯一的,因此set中的元素不能重复。map/multimap中存储的是真正的键值对,set中只放value,但底层实际存放的是由构成的键值对。set和map的插入删除操作基本相同,但在进行插入操作时,set不需要构造键值对,直接插入value即可。

void Test() {
	vector v{ 1, 2, 3, 5, 6, 7, 9, 34, 56, 2, 3, 6, 11, 23 };
	//set在插入元素的时候会默认按小于的比较方式排成有序序列,并且会自动去重
	set s(v.begin(), v.end());

	cout << s.size() << endl;
	for (auto & e : s) {
		cout << e << ' ';
	}
} 

multiset和set的区别:set中的value是唯一的,multiset中的value可以重复,因此,set可以用来去重,multiset可以用来排序。

你可能感兴趣的:(关联式容器map、set的插入和删除操作)