IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++基础知识 - map -> 正文阅读

[C++知识库]C++基础知识 - map

概述

  • map是典型的关联容器

    关联容器的特点是,按照关键字保存和访问。底层结构是用红黑树实现。

  • map还是有序容器

    默认情况下,标准库使用关键字类型的<运算符来比较两个关键字。所以,关键字的类型需要定义“正常行为”的<运算符。

    所有元素都会根据元素的关键字值自动排序。

  • map中所有元素都是pair

    pair中的第一个元素为key(关键字),起到索引的作用,第二个元素为vaule(值)。

  • 不重复

    map中不允许容器中有重复关键字元素。

创建

类别声明
empty (1)explicit map (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
explicit map (const allocator_type& alloc);
range (2)template <class InputIterator>
map (InputIterator first, InputIterator last,
const key_compare& comp = key_compare(),
const allocator_type& = allocator_type());
copy (3)map (const map& x);
map (const map& x, const allocator_type& alloc);
move (4)map (map&& x);
map (map&& x, const allocator_type& alloc);
initializer list (5)map (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());

创建一个空map

std::map<std::string, int> map_; // 创建一个key类型为string,value类型为int的空map

查看

empty

bool empty() const noexcept;

查看map是否为空,size 为 0,则为true。建议使用该函数来查看map是否为,而不是比较size() == 0.

大小

size_type size() const noexcept;

size()返回该map中有多少个元素。

查找

iterator find (const key_type& k);
const_iterator find (const key_type& k) const;

查找某个关键字是否存在,存在则返回该元素对应的迭代器;不存在返回map::end

std::map<std::string, int> map_;
const char *key = "test_key";
std::map<std::string, int>::iterator it = map_.find(key);
if (it != map_.end()) {
    // found.
} else {
    // not found.
}

注意:

不推荐使用下标来查找,通过下标查找有一个严重的副作用:如果关键字还未在map中,下标操作会插入一个具有给定关键字的元素。

遍历

通过迭代器遍历map

std::map<std::string, int> map_;
std::map<std::string, int>::iterator it;
for (it = map_.begin(); it != map_.end(); ++it) {
    printf("key: %s, value: %d\n", it->first.c_str(), it->second);
}

增加

insert

类别声明
single element (1)pair<iterator,bool> insert (const value_type& val);
template <class P> pair<iterator,bool> insert (P&& val);
with hint (2)iterator insert (const_iterator position, const value_type& val);
template <class P> iterator insert (const_iterator position, P&& val);
range (3)template <class InputIterator>
void insert (InputIterator first, InputIterator last);
initializer list (4)void insert (initializer_list<value_type> il);

使用make_pair

std::map<std::string, int> map_;
map_.insert(std::make_pair("key1", 1));

C++11中,创建一个pair最简单的方法是在参数列表中使用花括号初始化

std::map<std::string, int> map_;
map_.insert({"key1", 1});

注意:

  • 不能修改

    insert插入时,如果该关键字已经存在,则不做任何操作,即不能修改该关键字对应的值。

  • 返回值

    insert返回一个pair,pair的first成员是一个迭代器,指向具有给定关键字的元素;second成员是一个bool值,指出元素是插入成功还是已经存在于容器中。如果关键字已在容器中,则insert什么事情也不做,且返回值中的bool部分为false。如果关键字不存在,元素被插入容器中,且bool值为true。

下标

使用下标[]插入元素

std::map<std::string, int> map_;
map_["key1"] = 1;

下标插入的过程是:

如果容器中存在该关键字,则用该最新值更新原来的值;如果关键字不存在,则插入该元素。

删除

erase

iterator  erase (const_iterator position);
size_type erase (const key_type& k);
iterator  erase (const_iterator first, const_iterator last);\

通过关键字删除

std::map<std::string, int> map_;
const char *key = "key1";
map_.erase(key);

通过迭代器删除

std::map<std::string, int> map_;
const char *key = "key1";
// 查找关键字是否存在
std::map<std::string, int>::iterator it = map_.find(key);
if (it != map_.end()) {
    map_.erase(it); // 存在则删除
}

通过迭代器范围删除

std::map<std::string, int> map_;
map_.erase(map_.begin(), map_.end()); // 删除整个map

clear

void clear() noexcept;

清空map,资源是否被释放,需要再研究看看。

修改

通过下标插入来修改

std::map<std::string, int> map_;
const char *key = "key1";
int value = 1;
... ...
// 判断map_中是否包含某个关键字,存在则更新
std::map<std::string, int>::iterator it = map_.find(key);
if (it != map_.end()) {
    map_[key] = value; // 通过下标的方式更新原有的值
}

参考

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:05:10  更:2021-11-28 11:07:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:44:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码