C++STL | map/multimap容器和对组pair

map/multimap特性

map相对于set区别,map具有键值和实值,所有元素根据键值自动排序。pair的第一元素被称为键值,第二元素被称为实值。map也是以红黑树为底层实现机制。

我们通过map的迭代器可以修改map的键值吗?
答案是否定的,键值关系到容器内元素的排列规则,任意改变键值会破坏容器的排列规则,但是你可以改变实值。

map和multimap区别在于,map不允许相同key值存在,multimap则允许相同key值存在。

对组pair

对组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个公有函数first和second访问。

类模板:template struct pair.

如何创建对组?

//第一种方法创建一个对组
pair pair1(string("name"), 20);
cout << pair1.first << endl; //访问pair第一个值
cout << pair1.second << endl;//访问pair第二个值

//第二种
pair pair2 = make_pair("name", 30);
cout << pair2.first << endl;
cout << pair2.second << endl;

//pair=赋值
pair pair3 = pair2;
cout << pair3.first << endl;
cout << pair3.second << endl;

map常用API

map构造函数
map mapTT;//map默认构造函数: 
map(const map &mp);//拷贝构造函数
map赋值操作
map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器
map大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
map插入数据元素操作
map.insert(...); //往容器插入元素,返回值是pair类型
map mapStu;

// 第一种 通过pair的方式插入对象。 匿名对象
mapStu.insert(pair(3, "小张"));

// 第二种 通过pair的方式插入对象
mapStu.inset(make_pair(-1, "校长"));

// 第三种 通过value_type的方式插入对象
mapStu.insert(map::value_type(1, "小李"));

// 第四种 通过数组的方式插入值,存在就创建,已存在就修改
mapStu[3] = "小刘"; 
mapStu[5] = "小王";

注意:
前三种方法,采用的是insert()方法,该方法返回值为pair

第四种方法非常直观,但存在一个性能的问题。插入3时,先在mapStu中查找主键为3的项,若没发现,则将一个键为3,值为初始化值的对组插入到mapStu中,然后再将值修改成“小刘”。若发现已存在3这个键,则修改这个键对应的value。

string strName = mapStu[2]; //取操作或插入操作
只有当mapStu存在2这个键时才是正确的取操作,否则会自动插入一个实例,键为2,值为初始化值。

map删除操作
clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。
map查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
lower_bound(keyElem);//返回第一个key<=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);
/*返回容器中key与keyElem相等的上下限的两个迭代器。即返回一个pair,前一个指向lower_bound,后一个指向upper_bound
*/

map的补充

和set一样会自动排序,须添加一个参数,即将仿函数放入第三个参数。键值为自定义类型的map才能排序。

class Mykey;
struct mycompare{。      //仿函数写class也行
  bool mycompare(Mykey v1,Mykey v2){
      return v1.key>v2.key;
  }
}

map<自定义类型,t2,mycompare> mymap;

你可能感兴趣的:(C++STL | map/multimap容器和对组pair)