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

简介: 这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。

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;
相关文章
|
3天前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
18 5
|
4天前
|
C++ Python
UE C++ 链表
UE C++ 链表
|
9天前
|
存储 缓存 编译器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
10 0
|
9天前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
14 0
|
4天前
|
C++
C++一分钟之-类与对象初步
【6月更文挑战第20天】C++的类是对象的蓝图,封装数据和操作。对象是类的实例。关注访问权限、构造析构函数的使用,以及内存管理(深拷贝VS浅拷贝)。示例展示了如何创建和使用`Point`类对象。通过实践和理解原理,掌握面向对象编程基础。
32 2
C++一分钟之-类与对象初步
|
1天前
|
数据安全/隐私保护 C++
C++语言深入理解类的封装与数据隐藏
深入理解类的封装与数据隐藏
|
5天前
|
存储 编译器 C++
|
5天前
|
C++
C++类和类模板——入门
C++类和类模板——入门
10 1
|
6天前
|
数据安全/隐私保护 C++
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
|
9天前
|
存储 编译器 C++
【C++初阶】—— 类和对象 (中)
【C++初阶】—— 类和对象 (中)
20 3