C++的list-map链表与映射表

简介: C++ list-map链表与映射表的简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。

C++ list-map链表与映射表的简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。

list 链表

链表是由节点之间通过指针连接而成的链式结构存储结构体,对于链表,C++标准库中已经提供了封装好的链表了。

require:

#include <list>  //1.包含头文件
using namespace std;  //2.打开标准命名空间

定义链表,并在首、尾添加、删除元素

list<int> lst;  //定义链表对象,list后<>中指定节点元素类型
lst.push_front(0);  //链表头添加
lst.push_back(1);   //链表尾添加
lst.pop_front();  //删除头节点
lst.pop_back();   //删除尾节点

迭代器遍历链表

//begin() : 返回头节点
//end()   : 返回无效的尾节点
list<int>::iterator ite = lst.begin();  //定义迭代器指向头节点
while(ite != lst.end()) {   //不等于链表的尾节点
    cout << *ite << "  ";   //operator*
    ite++;                  //operator++
}

任意位置插入或删除

//insert()  erase()
ite2 = lst.insert(ite1, value);  //在 ite1 指向的位置之前插入元素value,返回插入元素的迭代器
ite2 = lst.erase(ite1);  //删除 ite1 指向的节点,ite1 将失效不可用,返回删除节点的下一个节点
ite = lst.erase(ite);  //多数情况下,用于删除的迭代器也可以承接其返回值,自带++效果
lst.erase(ite++);  //上述情况也可以这么写

获取首尾节点中元素的值

注意:end() 返回的是无效的尾节点,不能对其进行间接引用

获取首尾节点中元素的值
注意:end() 返回的是无效的尾节点,不能对其进行间接引用

使用增强的范围for循环进行遍历链表

for (int v : lst) {
    cout << v << "  ";
}

加引用可以修改节点里的值

for (int &v : lst) {
    //...
    v=value;
    //...
}

其他常见的函数

lst.empty();  //判断当前链表是否为空(bool类型),空返回true,非空返回false
lst.size();   //获取链表的长度(有效节点数量)
lst.clear();  //清空链表,empty 为 ture,size 为 0

map 映射表

map 为映射表,每一个元素称之为键值对(pair),分为键值(key)和实值(value),键值是唯一的(不能重复),所有元素都会根据元素的键值自动被排序。

require:

#include <map>  //1.包含头文件
using namespace std;  //2.打开标准命名空间

定义map

//格式:map<key,value> mm;
map<char, int> mm;

添加

//格式:mm[key] = value;
mm['B'] = 1;  //使用[]添加元素
mm['D'] = 2;
mm['A'] = 3;
mm['C'] = 4;

使用函数插入元素

mm.insert(pair<char, int>('E', 5));

迭代器遍历map

map中的元素会自动按照键值进行排序

map<char, int>::iterator ite = mm.begin();
    while (ite != mm.end()) {
        //first : 取键值,后面不要加(),second : 实值
        cout << ite->first << "-" << ite->second << "   ";
            ite++;
    }
    cout << endl;

修改

当键值已经存在时,会直接修改实值

mm['B'] = 50;  //如果键值存在,则是通过键值修改实值

删除

例:删除第二个元素

ite = ++mm.begin();
    ite = mm.erase(ite);  //删除 , 参数迭代器默认会失效,所以一般情况下返回值会接一下,返回的是删除的下一个

使用增强的范围for循环遍历

for (pair<char,int> pr : mm) {
        cout << pr.first << "-" << pr.second << "  ";
    }
    cout << endl;

使用引用,也可以修改实值

count统计

统计某个键值出现的次数,map键值唯一,可以用来判断某个键值是否存在

int count = mm.count('B');  //按照键值统计,可用于判断键值是否存在
    cout << count << endl;
相关文章
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
38 5
|
3月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
59 3
【C++】map、set基本用法
|
3月前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
37 5
|
3月前
|
存储 C++ 容器
【C++】map的模拟实现
C++中的`map`是STL中的一种关联容器,存储键值对且键唯一。`map`基于红黑树实现,自动按键排序,支持动态调整、复杂数据类型、丰富的成员函数及双向迭代器。插入、查找等操作保证了对数时间复杂度,适用于需要快速查找和有序存储的场景。
30 3
|
4月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
93 0
|
4月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
7月前
|
C++ 容器
【C++】map和set封装
【C++】map和set封装
54 2
|
7月前
|
存储 C++ 容器
【C++】map和set深度讲解(下)
【C++】map和set深度讲解(下)
79 2
|
7月前
|
存储 自然语言处理 Java
【C++】map和set深度讲解(上)
【C++】map和set深度讲解(上)
62 2
|
7月前
|
存储 算法 C++
C++一分钟之-扁平化映射与unordered_map
【7月更文挑战第5天】C++的STL `unordered_map`是键值对的快速查找容器,基于哈希表。常见问题包括哈希函数选择、键类型限制、内存管理和迭代顺序不确定性。要避免问题,需优化哈希函数,确保自定义类型支持哈希和比较操作,合理管理内存,不依赖迭代顺序。提供的代码示例展示了如何为自定义类型定义哈希函数并操作`unordered_map`。正确使用能提升代码效率。
91 0
C++一分钟之-扁平化映射与unordered_map