【C++常用容器】STL基础语法学习&map容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: map中的所有元素都是pair,pair中第一个元素为key(键值),第二个元素为value(实值),并且所有元素会根据元素的键值自动进行从小到大的排序。它可以根据key的值快速的找到value的值。map与multimap为关联式容器,map不允许容器中有重复的key值,而multimap允许容器中有重复的key值,两者底层的原理是用二叉树实现的。

●map基本概念


       map中的所有元素都是pair,pair中第一个元素为key(键值),第二个元素为value(实值),并且所有元素会根据元素的键值自动进行从小到大的排序。它可以根据key的值快速的找到value的值。map与multimap为关联式容器,map不允许容器中有重复的key值,而multimap允许容器中有重复的key值,两者底层的原理是用二叉树实现的。


●map构造和赋值


函数原型:


       1.构造


       ■map<T1, T2> mp         //map默认构造函数


       ■map(const map &mp)         //拷贝构造函数


       2.赋值


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


#include<iostream>
#include<map>
using namespace std;
void printmap(map<int,int>&m)
{
  for (map<int, int>::iterator i = m.begin(); i != m.end(); i++)
  {
  cout << "key=" << i->first << " " << "value=" << i->second << endl;
  }
  cout << endl;
}
void text()
{
  map<int, int>m;
  for (int i = 1, j = 10; i <= 10; i++, j += 10)
  {
  m.insert(pair<int,int>(i,j));
  }
  //拷贝构造
  map<int, int>m1(m);
  printmap(m1);
  //赋值
  map<int, int>m2;
  m2 = m1;
  printmap(m2);
}
int main()
{
  text();
}

0b7c4cced1389c33d417ca1bea68b5f0_d86fd479118c411a89843abe776f86aa.png


●map大小和交换


函数原型:


       1.大小


       ■size()         //返回容器中元素的数目


       ■empty()         //判断容器是否为空


       2.交换


       ■swap(st)         //交换两个集合容器


#include<iostream>
#include<map>
using namespace std;
void swap(map<int, int>& m1, map<int, int>& m2)
{
  m1.swap(m2);
}
void issize(map<int, int>& m)
{
  cout << "map的大小为:" << m.size() << endl;
}
void isempty(map<int,int>&m)
{
  if (m.empty()) {
  cout << "map为空" << endl;
  }
  else {
  cout << "map不为空" << endl;
  issize(m);
  }
}
void printmap(map<int,int>&m)
{
  for (map<int, int>::iterator i = m.begin(); i != m.end(); i++)
  {
  cout <<"value=" << i->second << endl;
  }
  cout << endl;
}
void text()
{
  map<int, int>m;
  m.insert(pair<int, int>(1, 1));
  m.insert(pair<int, int>(2, 3));
  m.insert(pair<int, int>(3, 5));
  m.insert(pair<int, int>(4, 7));
  m.insert(pair<int, int>(5, 9));
  //判断是否为空,大小为多少
  isempty(m);
  //交换
  map<int, int>m1;
  m1.insert(pair<int, int>(1, 2));
  m1.insert(pair<int, int>(2, 4));
  m1.insert(pair<int, int>(3, 6));
  m1.insert(pair<int, int>(4, 8));
  m1.insert(pair<int, int>(5, 10));
  cout << "交换前:" << endl;
  printmap(m);
  printmap(m1);
  cout << "交换后:" << endl;
  swap(m,m1);
  printmap(m);
  printmap(m1);
}
int main()
{
  text();
}

71719ef44035b54f76ed557ce802a4dd_6db9f249b5f84f2b9b0ea17394844a20.png


●map插入和删除


函数原型:


       1.插入


       ■insert(elem); //在容器中插入元素


       2.删除


       ■clear()         //清除所有元素


       ■erase(pos)         //删除pos迭代器所指的元素,返回下一个元素的迭代器


       ■erase(beg,end)         //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器


       ■erase(key)         //删除容器中值为key的元素


#include<iostream>
#include<map>
using namespace std;
void printmap(map<int,int>&m)
{
  for (map<int, int>::iterator i = m.begin(); i != m.end(); i++)
  {
  cout << "key=" << i->first << " " << "value=" << i->second << endl;
  }
  cout << endl;
}
void text()
{
  map<int, int>m;
  //插入
  for (int i = 1, j = 1; i <= 5; i++, j += 1)
  {
  m.insert(pair<int,int>(i,j));
  }
  for (int i = 6, j = 7; i <= 10; i++, j += 1)
  {
  m.insert(make_pair(i, j));
  }
  for (int i = 11, j = 10; i <= 15; i++, j += 1)
  {
  m[i] = j;
  }
  printmap(m);
  //删除
  m.erase(m.begin());
  m.erase(2);
  m.erase(3);
  m.erase(13);
  m.erase(14);
  printmap(m);
  //清空
  //m.erase(m.begin(), m.end());
  m.clear();
  printmap(m);
}
int main()
{
  text();
}

9e9d55598ec0679f8abee5e268211068_1fe8a09cb71f4860a8e767455932d7ed.png


●map查找和统计


函数原型:


       1.查找


       ■find(key)     //查找key是否存在,若存在,返回该键 的元素的迭代器;若不存在,返回set.end()


       2.统计


       ■count(key)         //统计key的元素个数    

#include<iostream>
#include<map>
using namespace std;
void count(map<int, int>& m)
{
  cout << "请统计指定key下的元素个数:"<<endl;
  int n; cin >> n;
  cout << "num=" << m.count(n) << endl;
  //map不允许插入重复key元素,所以统计结果要么1,要么0
} 
void find(map<int,int>&m)
{
  cout << "请输入要查找的key:" << endl;
  int n; cin >> n;
  map<int,int>::iterator i=m.find(n);
  if (i!=m.end()) {
  cout << "该map容器中的元素:" << i->second << endl;
  }
  else {
  cout << "未找到元素" << endl;
  }
}
void printmap(map<int,int>&m)
{
  for (map<int, int>::iterator i = m.begin(); i != m.end(); i++)
  {
  cout << "key=" << i->first << " " << "value=" << i->second << endl;
  }
  cout << endl;
}
void text()
{
  map<int, int>m;
  for (int i = 1, j = 10; i <= 10; i++, j += 10)
  {
  m.insert(make_pair(i,j));
  }
  m.insert(make_pair(10,100));
  printmap(m);
  //查找
  find(m);
  //统计
  count(m);
}
int main()
{
  text();
}

87df20cdc7e07b593a9d83a3c3cff178_19c12b915d2844f9af7208c1bc9bd795.png


●map排序(map初始排序顺序为从小到大,用仿函数将其改为从大到小)


       1.内置数据类型排序

#include<iostream>
#include<map>
using namespace std;
class compare {
public:
  bool operator()(int m1,int m2) const
  {
  return m1 > m2;
  }
};
void printmap(map<int, int, compare>&m)
{
  for (map<int, int, compare>::iterator i = m.begin(); i != m.end(); i++)
  {
  cout << "key=" << i->first << " " << "value=" << i->second << endl;
  }
}
void text()
{
  map<int, int,compare>m;
  for (int i = 1, j = 10; i <= 10; i++, j += 10)
  {
  m.insert(make_pair(i,j));
  }
  printmap(m);
}
int main()
{
  text();
}

4a0f40537c7f73389fd242e2ce76e186_c1657d41f14649dfafa808d78dd4d0e1.png


       2.自定义数据类型排序


#include<iostream>
#include<map>
#include<string>
using namespace std;
class person {
public:
  string name;
  int age;
  person(string name, int age)
  {
  this->name = name;
  this->age = age;
  }
};
class compare {
public:
  bool operator()(int m1,int m2)const
  {
  return m1 > m2;
  }
};
void printmap(map<int, person, compare>& m)
{
  for (map<int, person, compare>::iterator i = m.begin(); i != m.end(); i++)
  {
  cout << "key=" << i->first << " " <<"姓名:"<<i->second.name << "年龄:" << i->second.age << endl;
  }
}
void text()
{
  person p1("张三", 19);
  person p2("李四", 20);
  person p3("王五", 21);
  map<int, person, compare>m;
  m.insert(make_pair(1, p1));
  m.insert(make_pair(2, p2));
  m.insert(make_pair(3, p3));
  printmap(m);
}
int main()
{
  text();
}

55506ab8ffb0d05b80d5a20fac11f641_36c9aa4293a243239284c8708b006be2.png



目录
相关文章
|
3天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
17 4
2023/11/10学习记录-C/C++对称分组加密DES
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
25天前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
32 0
|
2月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
59 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
2月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
64 5
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
27 1
|
2月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
72 2
|
11天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
142 77
|
19天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
3天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
18 3
实战~如何组织一个多容器项目docker-compose
下一篇
DataWorks