C++复习笔记--STL的list容器、set容器和map容器
创始人
2025-06-01 04:37:26
0

1--list容器

        list(链表)由一系列结点组成,每个结点包含指针域和数据域,STL中的链表实质上是一个双向循环链表;

1-1--list容器的构造函数

        list 容器常用的构造方式如下:

list lst; // lst采用模板类实现,为对象的默认构造形式

list(beg, end); // 构造函数将[beg, end)区间的元素拷贝到容器中

list(n, elem); // 构造函数将 n 个 elem 拷贝到容器中

list(const list &lst); // 拷贝构造函数

        代码实例:

#include 
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}int main(int argc, char* argv[]){// 默认构造函数std::list lst1;lst1.push_back(10);lst1.push_back(20);lst1.push_back(30);lst1.push_back(40);printList(lst1);// 区间构造函数std::list lst2(lst1.begin(), lst1.end());printList(lst2);// n个elem构造函数std::list lst3(4, 100);printList(lst3);// 拷贝构造函数std::list lst4(lst1);printList(lst4);return 0;
}

1-2--list容器的赋值和交换

        通过以下函数实现对 list 容器的赋值和交换:

assign(beg, end); // 将[beg, end)区间中的数据拷贝赋值到容器中

assign(n, elem); // 将 n 个 elem 拷贝赋值给容器

list& operator=(const list &list); // 重载等号操作符

swap(lst); // 将lst和容器的元素进行互换

        代码实例:

#include 
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}int main(int argc, char* argv[]){std::list lst1;lst1.push_back(10);lst1.push_back(20);lst1.push_back(30);lst1.push_back(40);printList(lst1);std::list lst2;lst2.assign(lst1.begin(), lst1.end());printList(lst2);std::list lst3;lst3.assign(4, 100);printList(lst3);std::list lst4;lst4 = lst1;printList(lst4);// before changestd::cout << "before change: " << std::endl;printList(lst1);printList(lst3);lst1.swap(lst3);std::cout << "after change: " << std::endl;printList(lst1);printList(lst3);return 0;
}

1-3--list容器的大小操作

        通过以下函数实现对 list 容器的大小操作:

size(); // 返回容器中元素的个数

empty(); // 判断容器是否为空

resize(num); // 重新指定容器的长度为 num,若容器变长则以默认值0填充,若容器变短则多余的元素会被删除

resize(num, elem); // 重新指定容器的长度为 num,若容器变长则以 elem 值填充,若容器变短则多余的元素会被删除

        代码实例:

#include 
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}int main(int argc, char* argv[]){std::list lst1;lst1.assign(4, 10);printList(lst1);if(lst1.empty()){std::cout << "The list is empty !" << std::endl;}else{std::cout << "Num data of list: " << lst1.size() << std::endl;lst1.resize(2);printList(lst1);lst1.resize(4);printList(lst1);lst1.resize(10, 1);printList(lst1);}return 0;
}

1-4--list容器的插入和删除

        通过以下函数实现瑞容器数据的插入和删除:

push_back(elem); // 在容器尾部插入一个元素

pop_back(); // 删除容器中最后一个元素

push_front(elem); // 在容器开头插入一个元素

pop_front(); // 在容器开头移除第一个元素

insert(pos, elem); // 在pos位置插如elem元素,返回新数据的位置

insert(pos, n, elem); // 在pos位置插入n个elem元素,没有返回值

insert(pos, beg, end); // 在pos位置插入[beg, end)区间的数据,没有返回值

clear(); // 移除容器的所有数据

erase(beg, end); // 删除[beg, end)区间的数据,返回下一个数据的位置

erase(pos); // 删除pos位置的数据,返回下一个数据的位置

remove(elem); // 删除容器中所有与elem值匹配的元素

        实例代码:

#include 
#include void printList(const std::list &L){for(std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}void test1(){std::list l1;// 头插 和 尾插l1.push_back(10);l1.push_back(20);l1.push_back(30);l1.push_front(300);l1.push_front(200);l1.push_front(100);printList(l1);// 尾删和头删l1.pop_back();l1.pop_front();printList(l1);// insert插入std::list::iterator it = l1.begin();l1.insert(++it, 1000);printList(l1);// 删除it = l1.begin();l1.erase(++it);printList(l1);l1.push_back(10000);l1.push_back(10000);printList(l1);l1.remove(10000);printList(l1);
}int main(int argc, char *argv[]){test1();return 0;
}

1-5--list容器的数据存取

        list 容器不支持随机访问,可通过以下接口访问数据:

front() // 返回第一个数据

back() // 返回最后一个数据

        ​​​​​​​代码实例:

#include 
#include int main(int argc, char *argv[]){std::list lst1;lst1.push_back(10);lst1.push_back(20);lst1.push_back(30);lst1.push_back(40);std::cout << lst1.front() << std::endl; // 第一个元素std::cout << lst1.back() << std::endl; // 最后一个元素// list容器不支持随机访问std::list::iterator it = lst1.begin();it++;it--;// it = it + 1; //错误std::cout << *it << std::endl;return 0;
}

1-6--list容器的反转和排序

        通过以下接口实现 list 容器的反转和排序:

reverse(); // 实现容器的反转

sort(); // 实现容器的排序

// 注:所有不支持随机访问迭代器的容器,不可以使用标准算法;

// 不支持随机访问迭代器的容器,内部会提供相应的排序算法

        代码实例:

#include 
#include void printList(const std::list& L){for (std::list::const_iterator it = L.begin(); it != L.end(); it++){std::cout << *it << " ";}std::cout << std::endl;
}bool mycompare(int v1, int v2){return v1 > v2; // 降序 v1 > v2
}int main(int argc, char *argv[]){std::list lst1;lst1.push_back(10);lst1.push_back(30);lst1.push_back(20);lst1.push_back(40);printList(lst1);// 反转lst1.reverse();printList(lst1);// 默认升序lst1.sort();printList(lst1);// 降序lst1.sort(mycompare);printList(lst1);return 0;
}

1-7--list容器排序案例

        ​​​​​​​对于自定义数据类型,使用排序操作时必须指定排序的规则:

#include 
#include 
#include class Person{
public:Person(std::string name, int age, int height){this -> name = name;this -> age = age;this -> height = height;}std::string name;int age;int height;
};void printList(const std::list &lst){for(std::list::const_iterator it = lst.begin(); it != lst.end(); it++){std::cout << "Name: " << (*it).name << ", Age: " << (*it).age << ", Name: " << (*it).height << std::endl;}
}bool myCompare(Person &p1, Person &p2){// 按照年龄升序if(p1.age == p2.age){// 年龄相同,身高降序return p1.height > p2.height;}else{return p1.age < p2.age;}
}int main(int argc, char *argv[]){std::list lst1;Person p1("Zhangsan", 25, 175);Person p2("Lisi", 25, 165);Person p3("Wangwu", 25, 178);Person p4("Zhaoliu", 30, 175);lst1.push_back(p1);lst1.push_back(p2);lst1.push_back(p3);lst1.push_back(p4);printList(lst1);std::cout << "After sort: " << std::endl;lst1.sort(myCompare);printList(lst1);return 0;
}

2--set容器

未完待续!

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...