首页 > 编程语言 >c++STL—容器map/multimap

c++STL—容器map/multimap

时间:2023-05-20 10:01:22浏览次数:49  
标签:map multimap insert STL make c++ mp key pair

1、map基本概念

1.1、简介

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 所有元素都会根据元素的键值自动排序

1.2、本质

  • map/multimap属于关联式容器,底层结构是用二叉树实现。

1.3、优点

  • 可以根据key值快速找到value值

1.4、map和multimap区别

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

2、map构造和赋值

2.1、功能描述

  • 对map容器进行构造和赋值操作

2.2、函数原型

构造:

  • map<T1, T2> mp; //map默认构造函数:
  • map(const map &mp); //拷贝构造函数

赋值:

  • map& operator=(const map &mp); //重载等号操作符

2.3、示例

//map的构造和赋值
void printMap(map<int,string> m) {
	map<int, string>::iterator it;
	it = m.begin();
	for (int i = 0; i < m.size();i++) {
		cout<<"key = "<<it->first<<"  value = "<<it->second<<endl;
		it++;
	}
	cout << endl;
}

void test01() {
	//1、默认构造
	map<int, string> mp;

	mp.insert(make_pair(1,"zhangsan"));
	mp.insert(make_pair(2,"lisi"));
	mp.insert(make_pair(3,"wangwu"));
	mp.insert(make_pair(4,"laoliu"));
	mp.insert(make_pair(5,"xiaoqi"));
	printMap(mp);

	//2、拷贝构造
	map<int, string> mp2(mp);
	printMap(mp2);

	//3、赋值
	map<int, string> mp3;
	mp3 = mp2;
	printMap(mp3);

}

int main() {
	test01();
	system("pause");
	return 0;
}

c++STL—容器map/multimap_C++

注意事项:map中所有元素都是成对出现,插入数据时需要使用对组pair


3、map的大小和交换

3.1、功能描述

  • 统计map容器大小以及交换map容器

3.2、函数原型

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

3.3、示例

//map的大小和互换
void printMap(map<int, string> m) {
	map<int, string>::iterator it;
	it = m.begin();
	for (int i = 0; i < m.size(); i++) {
		cout << "key = " << it->first << "  value = " << it->second << endl;
		it++;
	}
	cout << endl;
}

void test01() {
	map<int, string> mp;

	mp.insert(make_pair(1, "zhangsan"));
	mp.insert(make_pair(2, "lisi"));
	mp.insert(make_pair(3, "wangwu"));
	mp.insert(make_pair(4, "laoliu"));

	map<int, string> mp1;

	mp1.insert(make_pair(4, "哈哈哈"));
	mp1.insert(make_pair(6, "啦啦啦"));
	mp1.insert(make_pair(8, "嘿嘿嘿"));
	
	//1、判断是否为空
	if (mp.empty()) {
		cout << "map容器为空" << endl;
	}
	else {
		cout << "map容器不为空" << endl;
		//2、访问大小
		cout << "map容器的大小为:" << mp.size() << endl;
	}

	//3、交换
	cout << "交换前:" << endl;
	printMap(mp);
	printMap(mp1);

	mp.swap(mp1);
	cout << "交换后:" << endl;
	printMap(mp);
	printMap(mp1);

}

int main() {
	test01();
	system("pause");
	return 0;
}

c++STL—容器map/multimap_C++_02

4、map插入和删除

4.1、功能描述

  • map容器进行插入数据和删除数据

4.2、函数原型

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(key); //删除容器中值为key的元素。

4.3、示例

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

void test01() {
	int key[] = { 1,2,3,4,5 };
	char val[] = { 'a','b','c','d','e' };
	map<int, char> m;
	for (int i = 0; i < sizeof(key) / sizeof(key[0]);i++) {
		//1、插入
		m.insert(make_pair(key[i], val[i]));//1、第一种插入
	}
	printMap(m);
	
	m.insert(map<int,char>::value_type(6,'f'));//第二种插入
	
	m.insert(pair<int, char>(7, 'g'));//第三种插入
	
	m[8] = 'h';//第四种插入(不推荐使用)
	printMap(m);

	cout << m[3] << endl;//多数用于通过键,访问值

	//2、删除
	m.erase(m.begin());	//指定位置

	m.erase(7);//通过键删除
	printMap(m);

	m.erase(m.begin(),m.end());//通过区间删除(此区间为删除所有)
	printMap(m);

	//3、清空
	m.clear();
	printMap(m);
}

int main() {
	test01();
}

c++STL—容器map/multimap_map容器_03

5、map查找和统计

5.1、功能描述

  • 对map容器进行查找数据以及统计数据

5.2、函数原型

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
  • count(key); //统计key的元素个数

5.3、示例

//map的查找和统计
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 test01() {
	map<int,int> m;
	m.insert(make_pair(1, 10));
	m.insert(make_pair(2, 20));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(4, 40));

	printMap(m);

	//1、查找
	map<int, int>::iterator it = m.find(4);
	if (it!= m.end()) {
		cout << "找到了" << endl;
		cout << "key = " << it->first << " value = " << it->second << endl;
	}
	else {
		cout << "未找到" << endl;
	}

	//2、统计
	int ret = m.count(3);
	cout << "key = 3 出现:" << ret <<"次" << endl;
}

int main() {
	test01();
}

c++STL—容器map/multimap_map容器_04

6、map容器排序

6.1、学习目标

  • map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则

6.2、主要技术点

  • 利用仿函数,可以改变排序规则

6.3、示例

//map的排序
class myCompare {
public:
	bool operator()(int v1, int v2)const {
		return v1 > v2;
	}
};

void test01() {
	//1、默认升序
	map<int, int> m;
	m.insert(make_pair(1, 10));
	m.insert(make_pair(3, 30));
	m.insert(make_pair(2, 20));	
	m.insert(make_pair(4, 40));

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

	//2、重写(),改变排序规则
	map<int, int,myCompare> m1;
	m1.insert(make_pair(1, 10));
	m1.insert(make_pair(2, 20));
	m1.insert(make_pair(4, 40));
	m1.insert(make_pair(3, 30));	

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

int main() {
	test01();
}

c++STL—容器map/multimap_map容器_05

标签:map,multimap,insert,STL,make,c++,mp,key,pair
From: https://blog.51cto.com/qiux/6317188

相关文章

  • 云原生之使用docker部署TestLink测试平台
    (云原生之使用docker部署TestLink测试平台)一、TestLink介绍TestLink是基于web的测试用例管理系统,主要功能是测试用例的创建、管理和执行,并且还提供了一些简单的统计功能。二、TestLink的特点测试需求管理测试用例管理测试用例对测试需求的覆盖管理测试计划的制......
  • C++图书信息管理系统系统[2023-05-19]
    C++图书信息管理系统系统[2023-05-19]图书信息管理系统系统问题描述本图书信息管理系统包括图书的编号、书名、作者、分类号、出版单位、出版时间和价格,可实现新建图书信息管理文件,录入图书信息,查询图书信息,删除图书信息,浏览图书信息。类的设计:classreader//读者类class......
  • C++内存管理
    C/C++内存分配在一个程序的进程地址空间中,其内存分配如下:栈用来存储非静态局部变量、函数参数/返回值等,栈是向下增长的;堆用于程序的动态内存分配,堆是向上增长的;数据段用来存储全局数据和静态数据;代码段用来存储可执行指令,只读常量,字符串常量就存储在代码段中。数据段和代码段在语言......
  • c++打卡练习(35)
    求分母为40的所有真分数流程图:伪代码:源代码:#include<iostream>usingnamespacestd;intmain(){inti,j,num1,num2,t,n=0;for(i=1;i<40;i++){ num1=40; num2=i; while(num2!=0){ t=num1%num2; num1=num2; num2=t; } if(num1==1){ n++; ......
  • C++
    定义抽象基类Shape,由它派生出五个派生类:Circle(圆形)、Square(正方形)、Rectangle(长方形)、Trapezoid(梯形)和Triangle(三角形),用虚函数分别计算各种图形的面积,并求出它们的和。要求用基类指针数组。使它的每一个元素指向一个派生类的对象。#include<iostream>usingnamespacestd;cl......
  • C++ 如何快速实现一个容器的迭代器
    C++如何快速实现一个容器的迭代器引言C++的标准库中的容器都会提供迭代器,如果一个容器满足forward_range,那么这个容器一般会提供以下成员类型和函数:iteratorconst_iteratorbeginendbegincend如果该容器还满足bidirectional_range,那么该容器还会额外提供以下成员类型和......
  • 详解c++STL—容器set/multiset
    1、set基本概念1.1、功能所有元素都会在插入时自动被排序1.2、本质:set/multiset属于关联式容器,底层结构是用二叉树实现。1.3、set和multiset区别set不允许容器中有重复的元素multiset允许容器中有重复的元素2、set构造和赋值2.1、功能描述创建set容器以及赋值2.1、构造set<T>st;/......
  • c++局部静态变量是线程安全的
    mark一下。c++11之前,局部静态变量初始化并不是线程安全的。c++11之后,当局部静态在初始化的过程中,有新的获取,会阻塞等待初始化成功。classInstance{public://... staticGetInstace() { staticInstanceinstance; returninstance; }};new,理论上应该也是可以的,......
  • 《C++ string类》
    1.string类常见的构造函数1)string(constchar*s):将string对象初始化为s指向的字符串stringstr("Hello!"); 2)string(size_typen,charc):创建一个包含n个元素的string对象,其中每个元素都被初始化为字符cstringstr(10,'a'); 3)string(conststring&str)......
  • C++中使用强类型的Enum Class
    在C++中,有Enumclass这种说法,在EffectivemodernC++这本书中,也提到Preferscopedenumstounscopedenum,就是说要用有范围的enumclass代替没有范围的enum.为什么会有这个问题呢?我们来看一个C++里面使用传统enum的例子:enumShape{circle,retangle};autocircle=10;......