首页 > 编程语言 >C++之map容器

C++之map容器

时间:2024-11-07 18:17:37浏览次数:3  
标签:std map 容器 C++ 插入 键值 排序

map 是 C++ STL (Standard Template Library) 中的一种关联容器,用于存储键值对(key-value pairs)。每个键(key)在 map 中都是唯一的,并且键值对会根据键的值进行排序(默认为升序)。map 的内部实现通常为红黑树,因此它提供了高效的插入、删除和查找操作。

主要特点

  1. 键的唯一性:每个键在 map 中都是唯一的。
  2. 排序:键值对根据键的值进行排序,默认为升序。
  3. 高效查找:插入、删除和查找操作的时间复杂度均为 O(log n)。
  4. 双向迭代器:可以使用双向迭代器来遍历 map 容器中的元素。

常用操作

定义和初始化
#include <map>

std::map<std::string, int> m; // 创建一个空的 map 容器
std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}}; // 初始化 map 容器
插入元素
m["orange"] = 3; // 插入键值对
m.insert({"grape", 4}); // 插入键值对
m.insert(std::make_pair("lemon", 5)); // 插入键值对
删除元素
m.erase("apple"); // 删除键为 "apple" 的键值对
m.erase(m.begin()); // 删除第一个键值对
查找元素
auto it = m.find("banana"); // 查找键为 "banana" 的键值对,返回指向该键值对的迭代器,如果找不到则返回 end()
if (it != m.end()) {
    std::cout << "Found " << it->first << ": " << it->second << std::endl;
} else {
    std::cout << "Not found" << std::endl;
}
检查元素是否存在
if (m.count("banana")) {
    std::cout << "banana is in the map." << std::endl;
} else {
    std::cout << "banana is not in the map." << std::endl;
}
获取元素数量
std::cout << "The map has " << m.size() << " key-value pairs." << std::endl;
清空容器
m.clear(); // 清空 map 容器
遍历容器
for (const auto& pair : m) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}
// 或者使用迭代器
for (auto it = m.begin(); it != m.end(); ++it) {
    std::cout << it->first << ": " << it->second << std::endl;
}

自定义比较函数

如果你想改变 map 中键的排序方式,可以提供一个自定义的比较函数或对象。例如,如果你想要创建一个键按降序排序的 map,你可以这样做:

#include <map>
#include <functional>

std::map<std::string, int, std::greater<std::string>> descendingMap; // 创建一个键按降序排序的 map

或者使用自定义的比较类:

struct CustomCompare {
    bool operator()(const std::string& a, const std::string& b) const {
        return a > b; // 降序排序
    }
};

std::map<std::string, int, CustomCompare> customMap;

总结

map 是一个非常有用的数据结构,当你需要存储唯一键及其对应的值,并且希望这些键值对是有序的时,它是一个很好的选择。由于它的内部实现,map 提供了高效的插入、删除和查找操作。map 在许多应用场景中都非常有用,例如字典、配置文件解析等。

标签:std,map,容器,C++,插入,键值,排序
From: https://blog.csdn.net/weixin_42300449/article/details/143604389

相关文章

  • C++之stack容器
    stack是C++STL(StandardTemplateLibrary)中的一种容器适配器,用于实现后进先出(LIFO,LastInFirstOut)的数据结构。stack提供了一组基本的操作来管理栈顶元素的插入和移除。stack的底层可以基于不同的容器(如vector、deque或list)实现,默认情况下使用deque。主要特......
  • C++之queue容器
    queue是C++STL(StandardTemplateLibrary)中的一种容器适配器,用于实现先进先出(FIFO,FirstInFirstOut)的数据结构。queue提供了一组基本的操作来管理队列前端和后端的元素。queue的底层可以基于不同的容器(如deque或list)实现,默认情况下使用deque。主要特点先进......
  • c++11 --- 左值与右值的使用;
    C++98的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,C++11之后我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名(语法层面上)。左值和右值左值是一个表示数据的表达式(如变量名或解引用的指针),一般是有持久状态,存储在内存中,我们......
  • 【C++】封装红黑树实现mymap和myset
     无论你觉得自己多么的了不起,也永远有人比你更强。......
  • C++继承
    文章目录一、继承的概念和定义1、继承的概念2、继承的定义3、继承基类成员访问方式的变化二、基类和派生类之间的转换三、继承中的作用域1、隐藏规则四、派生类的默认成员函数1、常见默认成员函数2、实现一个不能被继承的类五、继承与友元六、继承与静态成员变量七......
  • Java并发编程 --- 并发容器
    ConcurrentHashMap基本介绍在JDK1.8中,它的数据结构:Node数组+链表/红黑树初始化/***Initializestable,usingthesizerecordedinsizeCtl.*/privatefinalNode<K,V>[]initTable(){Node<K,V>[]tab;intsc;while((tab=table)==null||tab.length......
  • C++ 的前世今生:从“小兄弟”到编程大佬
    当你听到C++这个名字,可能会有点好奇:为什么名字里有个“++”?其实,这个“++”是C++编程中的一个符号,意思是“加一”,也可以理解为“进化版”。C++的名字暗示了它比C语言更加强大、功能更多。那么,这个编程语言是怎么来的?又有什么特别之处呢?让我们用大白话来聊聊C++的历......
  • 使用C++和QT开发应用程序入门以及开发实例分享
    目录1、搭建开发环境(VS2010和QT4.8.2)2、创建一个QT窗口3、在QT窗口中添加子窗口4、QT界面布局5、QT信号(SIGNAL)和槽(SLOT)6、最后C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++实......
  • C++ 的“百变魔法”:搞懂基本数据类型和变量
    编程世界里,数据就像材料,而基本数据类型就决定了这些材料能做什么。每种数据类型都有它自己的“特长”,我们可以用它们来处理不同的信息。今天,我们就来看看C++里最常见的几种基本数据类型:int,char,float,double,bool,以及如何用变量来存储这些数据。什么是数据类型?简单......
  • CUDA开始的GPU编程 - 第四章:C++封装GPU上的数组
    第四章:C++封装GPU上的数组std::vector的秘密:第二模板参数**你知道吗?**std::vector作为模板类,其实有两个模板参数:std::vector<T,AllocatorT>那为什么我们平时只用了std::vector呢?因为第二个参数默认是std::allocator。也就是std::vector等价于std::vector<T,s......