【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



目录
相关文章
|
2天前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
27天前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
58 21
|
2天前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
2月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
47 1
|
2月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
71 7
|
2天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
5天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
2天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
2天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
70 19