【嵌入式——C++】map(STL)

【嵌入式——C++】 map(STL)

  • 基本概念
  • 构造和赋值
  • 大小和交换
  • 插入和删除
  • 查找和统计
  • 排序

基本概念

map中所有的元素都是pair,pair中第一个元素为key,起到索引作用,第二个元素为value;所有元素都会根据元素的键值自动排序;map、multimap属于关联式容器,底层结构是二叉树实现的;可以通过key快速找到value值;map不允许有重复key的元素,multimap允许有重复key的元素。
需要引入头文件#include

构造和赋值

默认构造

map<int, int> m;

拷贝构造

map<int, int> m2(m);

赋值

operator=

代码示例

void printMap(map<int, int> &m) {
 for (map<int, int>::iterator it = m.begin(); it != m.end();it++) {
  cout << "key=" << (*it).first << " value= " << it->second << endl;
 }
 cout << endl;

}

void testMap01() {

 //默认构造
 map<int, int> m;
 //默认按照key升序
 m.insert(pair<int,int>(1,10));
 m.insert(pair<int,int>(2, 20));
 m.insert(pair<int,int>(3, 30));
 m.insert(pair<int,int>(4, 40));
 printMap(m);
 /*
 key=1 value= 10
 key=2 value= 20
 key=3 value= 30
 key=4 value= 40
 */

 //拷贝构造
 map<int, int> m2(m);
 printMap(m2);

 map<int, int> m3;
 //赋值
 m3 = m;
 printMap(m3);

}

大小和交换

  1. size():返回元素个数;
  2. empty():判空;
  3. swap(ls):交换两个集合容器;

代码示例

void testMap02() {

 map<int, int> m;
 m.insert(pair<int, int>(1, 10));
 m.insert(pair<int, int>(2, 20));
 m.insert(pair<int, int>(3, 30));
 m.insert(pair<int, int>(4, 40));
 printMap(m);
 /*
 key=1 value= 10
 key=2 value= 20
 key=3 value= 30
 key=4 value= 40
 */
 if (m.empty()) {
  cout << "不为空"<<endl;
 }
 else {
  cout << "元素个数:" << m.size()<<endl;
 }

 map<int, int> m2;
 m2.insert(pair<int, int>(5, 100));
 m2.insert(pair<int, int>(6, 200));
 m2.insert(pair<int, int>(7, 300));
 m2.insert(pair<int, int>(8, 400));
 printMap(m2);
 /*key=5 value= 100
 key=6 value= 200
 key=7 value= 300
 key=8 value= 400*/

 m.swap(m2);
 printMap(m);
 /*key=5 value= 100
 key=6 value= 200
 key=7 value= 300
 key=8 value= 400*/
 printMap(m2);
 /*key=1 value= 10
 key=2 value= 20
 key=3 value= 30
 key=4 value= 40*/
}

插入和删除

  1. insert():插入;
  2. clear():清空;
  3. erase():删除。

代码示例

void testMap03() {
 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));
 //插入第四种
 //这种方法如果插入错误,会创建一个value为0的对组保存到map中,所以不建议这种方式
 m[4] = 40;
 cout << m[6] << endl;
 printMap(m);
 /*key=1 value= 10
 key=2 value= 20
 key=3 value= 30
 key=4 value= 40*/

 /*key=1 value= 10
 key=2 value= 20
 key=3 value= 30
 key=4 value= 40
 key=6 value= 0*/


 //删除
 m.erase(m.begin());
 //按照key删除
 m.erase(3);
 printMap(m);
 //区间删除
 m.erase(m.begin(),m.end());
 
 //清空
 m.clear();

}

查找和统计

  1. find(key):根据key来进行查找,若存在,返回该键的元素的迭代器,若不存在返回set.end();
  2. count(key):统计key的元素个数。

代码示例

void testMap04() {

 map<int, int> m;
 m.insert(pair<int, int>(1, 10));
 m.insert(pair<int, int>(2, 20));
 m.insert(pair<int, int>(3, 30));
 m.insert(pair<int, int>(4, 40));
 

 map<int, int>::iterator pos = m.find(3);
 if (pos != m.end()) {
  //查到了元素key=3 value=30
  cout << "查到了元素key=" << pos->first << " value=" << pos->second << endl;
 }
 else {
  cout << "未查到元素" << endl;
 }

 cout << "统计元素个数" << m.count(1);//1

}

排序

map容器默认排序规则按照key值从小到大排序,利用仿函数可以改变排序规则。
代码示例


class MyCompare {
public :
 //重载小括号
 bool operator()(int v1,int v2) const
 {
  return v1 > v2;
 }

};

void testMap05() {

 map<int, int> m;
 m.insert(pair<int, int>(1, 10));
 m.insert(pair<int, int>(2, 20));
 m.insert(pair<int, int>(3, 30));
 m.insert(pair<int, int>(4, 40));
 printMap(m);
 /*key=1 value= 10
 key=2 value= 20
 key=3 value= 30
 key=4 value= 40*/

 map<int, int,MyCompare> m2;
 m2.insert(pair<int, int>(1, 10));
 m2.insert(pair<int, int>(2, 20));
 m2.insert(pair<int, int>(3, 30));
 m2.insert(pair<int, int>(4, 40));
 for (map<int, int, MyCompare>::iterator it = m2.begin(); it != m2.end(); it++) {
  cout << "key=" << (*it).first << " value= " << it->second << endl;
 }
 /*key=4 value= 40
 key=3 value= 30
 key=2 value= 20
 key=1 value= 10*/
 cout << endl;

}

你可能感兴趣的:(c++,开发语言,qt,物联网,map)