关联容器
map,set
map
map是一种关联式容器包含 键/值 key/value 相当于python中的字典 不允许有重复的key map 无重复,有序
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
1、map简介
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。
对于迭代器来说,可以修改实值,而不能修改key。
2、map的功能
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是log(n) 如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key -Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
map的插入,有4种
map插入,删除
#include#include
map 的4中insert方法探究
void printMap(map&map1){ if (!map1.size()) { cout<< "map为空" << endl; } else { cout<< "迭代器遍历 map:\n"; for (map ::iterator it = map1.begin(); it != map1.end(); it++) { cout << "key = " << it->first << " values = " << it->second << endl; } }}// 插入的四种方法的 不同处// 前三种返回的都是 pair ,若key已经存在,则报错// 方法四 若key已经存在,则修改void test12(){ // 插入,四种常用的方法 // 方法一 map map1; // 无重复,有序 // typdef pair pairib; map1.insert(pair (1, "teacher1")); // 接收 insert的返回值是一个/* * iterator insert( iterator pos, const pair &val ); * void insert( input_iterator start, input_iterator end ); * pair insert( const pair &val ); * insert()函数: * * 插入val到pos的后面,然后返回一个指向这个元素的迭代器。 * 插入start到end的元素到map中。 * 只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值。 */ pair< map ::iterator, bool> MyPair1 = map1.insert(pair (2, "teacher2")); cout << "显示 insert 的返回值"< first = " << MyPair1.first->first < second = " << MyPair1.first->second<< endl< first = " << MyPair1.first->first < second = " << MyPair1.first->second<< endl; } cout << endl; map1[7] = "teacher7"; map1[7] = "teacher77"; // 这一步会插入失败 // 方法二 pair< map ::iterator, bool> MyPair2 = map1.insert(make_pair(3, "teacher3")); map1.insert(make_pair(4, "teacher4")); // 方法三 map1.insert(map ::value_type(5, "teacher55")); // 这一个会插入失败 auto MyPair3 = map1.insert(map ::value_type(5, "teacher5")); if (MyPair3.second == true) { cout << "key 1插入成功" << endl; cout << "MyPair3.second = " << MyPair3.second << endl; } else { cout << "插入失败:失败数据为:\n"; cout <<"MyPair3.first->first = " << MyPair3.first->first < second = " << MyPair3.first->second<< endl; } cout <
map 的fing 和equal_range
pair equal_range( const KEY_TYPE &key );
equal_range()函数返回两个迭代器——一个指向第一个键值为key的元素,另一个指向最后一个键值为key的元素
使用是 auto pair = map1.equal_range(key)
第一个迭代器的内容
pair.first->first
pair.first->first
第二个迭代器的内容
pair.second->first
pair.second->first
find
// iterator find( const KEY_TYPE &key ); // find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
#include#include
multimap
C++ Multimaps和很相似,但是MultiMaps允许重复的元素。
//// Created by lk on 18-6-3.//#include#include #include
set
和map实现原理差不多,都是用红黑树
set是有序,不可重复的集合
// 重要 // 1 集合 元素唯一 自动排序,不能按照数组[]的方式插入元素 // 红黑树 平衡二叉树
//// Created by lk on 18-6-3.//#include#include #include #include #include using namespace std;// 重要// 1 集合 元素唯一 自动排序,不能按照数组[]的方式插入元素// 红黑树 平衡二叉树void printSet(set &set1) { cout << "set遍历:"; for (auto it = set1.begin(); it != set1.end(); it++) { cout << *it << ' '; } cout << endl;}// 基本操作void test91() { set set1; // 从小到大,无重复 for (int i = 0; i < 5; i++) { int tem = rand() % 200; set1.insert(tem); } set1.insert(100); set1.insert(100); // 遍历 printSet(set1); // set1.erase(set1.begin(), set1.end());// 删除元素、一个一个删除也可以}// 对基本的数据类型,set可以排序,对复杂的用谓词,仿函数等void test92() { set set1; set