国内做外贸网站的有哪些,电商网站开发公司,一个人在线观看免费高清视频动漫,河南华盛建设集团网站目录
1. list 的介绍及使用
1.1 list 的介绍
知识点#xff1a;
小李的理解#xff1a;
1.2 list 的使用
1.2.1 list 的构造
知识点#xff1a;
小李的理解#xff1a;
代码示例#xff1a;
1.2.2 list 迭代器的使用
知识点#xff1a;
小李的理解#xff1…
目录
1. list 的介绍及使用
1.1 list 的介绍
知识点
小李的理解
1.2 list 的使用
1.2.1 list 的构造
知识点
小李的理解
代码示例
1.2.2 list 迭代器的使用
知识点
小李的理解
代码示例
1.2.3 list 的容量
知识点
小李的理解
代码示例
1.2.4 list 的元素访问
知识点
小李的理解
代码示例
1.2.5 list 的修改操作
知识点
小李的理解
代码示例
1.2.6 list 迭代器失效
知识点
小李的理解
代码示例
2. list 的模拟实现
知识点
小李的理解
代码示例
3. list 与 vector 的对比
知识点
小李的理解 总结 专栏C学习笔记 上一卷【C 】-vector新时代动态数组的革新与未来 C 中的 list 是一个强大的容器特别适用于需要频繁插入和删除元素的场景。本文将详细介绍 list 容器包括其介绍、使用方法、实现原理以及与 vector 容器的对比。
1. list 的介绍及使用
1.1 list 的介绍
知识点
list 是一种序列式容器底层实现为双向链表。双向链表中的每个元素存储在独立的节点中节点通过指针互相连接可以在常数时间内在任意位置进行插入和删除操作。与 forward_list 的单链表不同list 支持双向迭代。与其他序列式容器如 array、vector、deque相比list 在插入和删除操作方面表现更优但不支持随机访问。
小李的理解
list 就像一条双向街道上的车队每辆车节点都有前后两个链接指向前后两辆车。你可以轻松地在任何地方插入或删除一辆车而不需要移动其他车。但是如果你想找到某辆车就需要从头或尾开始一辆辆查找比较费时。 1.2 list 的使用
1.2.1 list 的构造
知识点
list 提供多种构造方法包括创建空的 list创建包含多个相同元素的 list使用区间构造 list 以及拷贝构造等。
小李的理解
构造 list 就像创建不同类型的车队你可以创建一个空车队或者一个全是同样车的车队还可以用现有的车队来创建新的车队。 代码示例
#include list
#include iostreamint main() {// 创建一个空的 liststd::listint empty_list;// 创建一个包含 5 个值为 10 的元素的 liststd::listint filled_list(5, 10);// 使用区间构造 listint arr[] {1, 2, 3, 4, 5};std::listint range_list(arr, arr 5);// 打印 filled_list 的元素for(int n : filled_list) {std::cout n ;}std::cout std::endl;return 0;
}这个程序首先创建一个空的 list然后创建一个包含 5 个值为 10 的 list接着用数组中的元素构造一个 list。最后打印 filled_list 的元素显示 5 个 10。 1.2.2 list 迭代器的使用
知识点
list 的迭代器类似于指针指向 list 中的节点。你可以使用迭代器遍历 list访问或修改元素。
小李的理解
迭代器就像你走在车队中的一个人你可以走到每辆车旁边查看里面的东西或者往回走查看后面的车。
代码示例
#include list
#include iostreamint main() {std::listint my_list {1, 2, 3, 4, 5};// 正向迭代for (auto it my_list.begin(); it ! my_list.end(); it) {std::cout *it ;}std::cout std::endl;// 反向迭代for (auto rit my_list.rbegin(); rit ! my_list.rend(); rit) {std::cout *rit ;}std::cout std::endl;return 0;
}这个程序创建一个包含 5 个整数的 list。正向迭代器遍历 list从头到尾打印元素反向迭代器遍历 list从尾到头打印元素。 1.2.3 list 的容量
知识点
你可以使用 empty() 函数检查 list 是否为空使用 size() 函数获取 list 中的元素个数。
小李的理解
这就像你检查车队中是否有车以及数一数车队中有多少辆车。
代码示例
#include list
#include iostreamint main() {std::listint my_list {1, 2, 3, 4, 5};// 检查是否为空if (my_list.empty()) {std::cout List is empty std::endl;} else {std::cout List is not empty std::endl;}// 获取大小std::cout List size: my_list.size() std::endl;return 0;
}程序首先检查 list 是否为空显然 my_list 不为空然后打印 list 的大小显示有 5 个元素。 1.2.4 list 的元素访问
知识点
你可以使用 front() 函数访问 list 的第一个元素使用 back() 函数访问 list 的最后一个元素。
小李的理解
这就像你想看看车队的第一辆车和最后一辆车里装了什么东西。
代码示例
#include list
#include iostreamint main() {std::listint my_list {1, 2, 3, 4, 5};// 访问第一个和最后一个元素std::cout First element: my_list.front() std::endl;std::cout Last element: my_list.back() std::endl;return 0;
}程序分别打印 list 的第一个和最后一个元素显示 1 和 5。 1.2.5 list 的修改操作
知识点
list 提供丰富的修改操作包括在头部和尾部插入和删除元素插入和删除特定位置的元素交换两个 list 的内容以及清空 list。
小李的理解
这就像你可以在车队的任何位置加车或减车甚至可以交换两队车里的车或者把整个车队清空。
代码示例 #include list
#include iostreamint main() {std::listint my_list {1, 2, 3, 4, 5};// 插入和删除操作my_list.push_front(0); // 在前面插入 0my_list.push_back(6); // 在后面插入 6my_list.pop_front(); // 删除第一个元素my_list.pop_back(); // 删除最后一个元素// 插入和删除特定位置的元素auto it my_list.begin();it; // 指向第二个元素my_list.insert(it, 100); // 在第二个位置插入 100it my_list.begin();it;my_list.erase(it); // 删除第二个位置的元素// 交换和清空 liststd::listint another_list {10, 20, 30};my_list.swap(another_list);my_list.clear();return 0;
}以下是程序在各步之后的状态 my_list 初始为 {1, 2, 3, 4, 5}插入 0 和 6 后为 {0, 1, 2, 3, 4, 5, 6}删除第一个和最后一个元素后为 {1, 2, 3, 4, 5}在第二个位置插入 100 后为 {1, 100, 2, 3, 4, 5}删除第二个位置的元素后为 {1, 2, 3, 4, 5}与 another_list 交换后 my_list 为 {10, 20, 30}清空后 my_list 为空 1.2.6 list 迭代器失效
知识点
在 list 中插入操作不会导致迭代器失效删除操作会使指向被删除节点的迭代器失效。
小李的理解
就像你从车队中移走一辆车时那个位置的指示牌迭代器也被移走了但其他位置的指示牌不受影响。
代码示例
#include list
#include iostreamint main() {std::listint my_list {1, 2, 3, 4, 5};auto it my_list.begin();while (it ! my_list.end()) {it my_list.erase(it); // 删除元素后更新迭代器}return 0;
}这个程序将删除 list 中的所有元素最后 my_list 为空。 每次删除一个元素后迭代器指向下一个元素直到 list 清空。 2. list 的模拟实现
知识点
实现一个简化版本的 list需要理解其底层结构和接口的含义。以下是一个简化的 list 实现示例
小李的理解
模拟实现 list 就像你自己动手造一辆汽车你需要理解汽车的每个部件和它们如何协同工作。
代码示例
#include iostreamtemplatetypename T
class Node {
public:T data;Node* prev;Node* next;Node(T val) : data(val), prev(nullptr), next(nullptr) {}
};templatetypename T
class List {
private:NodeT* head;NodeT* tail;public:List() : head(nullptr), tail(nullptr) {}void push_back(T val) {NodeT* newNode new NodeT(val);if (!tail) {head tail newNode;} else {tail-next newNode;newNode-prev tail;tail newNode;}}void print() {NodeT* temp head;while (temp) {std::cout temp-data ;temp temp-next;}std::cout std::endl;}~List() {NodeT* temp;while (head) {temp head;head head-next;delete temp;}}
};int main() {Listint my_list;my_list.push_back(1);my_list.push_back(2);my_list.push_back(3);my_list.print();return 0;
}这个程序手动实现了一个简单的 list并添加了 3 个元素。最终打印出 list 中的所有元素。 3. list 与 vector 的对比
知识点 底层结构 vector动态顺序表连续内存空间。list双向链表不连续。 随机访问 vector支持效率为 O(1)。list不支持效率为 O(N)。 插入和删除 vector效率低时间复杂度为 O(N)。list效率高时间复杂度为 O(1)。 空间利用率 vector高连续空间缓存利用率高。list低节点动态分配容易造成内存碎片。 迭代器 vector原生指针。list封装的节点指针。 迭代器失效 vector插入时可能失效删除时当前迭代器失效。list插入不会失效删除时当前迭代器失效。 使用场景 vector高效存储随机访问。list频繁插入和删除操作。 小李的理解
vector 就像一块连续的停车场每辆车元素都紧挨着如果你要在中间插入或删除一辆车就需要挪动很多车。而 list 就像一列火车每节车厢元素独立可以随意插入或移除车厢但要找到某个特定车厢就得一节一节地找。 总结 C 中的 list 容器是一个基于双向链表的序列式容器适用于需要频繁插入和删除操作的场景但不支持随机访问。list 提供了多种构造方法和丰富的操作接口包括插入、删除、访问等。与 vector 相比list 在插入和删除操作上更高效但在随机访问和空间利用率上较差。