C++第七讲:STL中list的使用及其模拟实现
在C++中,STL(标准模板库)提供了许多强大的数据结构和算法,其中std::list
是一个非常常用的双向链表实现。在本讲中,我们将介绍如何使用STL中的list
以及如何模拟实现一个简单的链表。
一、STL中std::list
的使用
std::list
是一个双向链表,这意味着你可以从链表的任意节点开始,向前或向后遍历。它的特点是插入和删除操作速度很快,特别是在任意位置进行操作时,不需要像向量那样移动其他元素。
1. 基本操作
以下是一些基本操作示例:
#include <iostream>
#include <list>
int main() {
std::list<int> myList = {1, 2, 3, 4, 5};
// 遍历并输出列表
for(int num : myList) {
std::cout << num << " ";
}
std::cout << std::endl;
// 在末尾添加元素
myList.push_back(6);
// 在开头添加元素
myList.push_front(0);
// 删除元素
myList.pop_front(); // 删除第一个元素
myList.pop_back(); // 删除最后一个元素
// 插入元素
auto it = myList.begin();
std::advance(it, 2); // 指针向前移动两个位置
myList.insert(it, 10);
// 删除指定元素
it = myList.begin();
std::advance(it, 2);
myList.erase(it);
// 输出修改后的列表
for(int num : myList) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
2. 特点
- 支持快速的插入和删除:在任意位置插入和删除元素的操作都是常数时间
O(1)
。 - 不支持随机访问:由于链表的结构,访问第i个元素需要
O(n)
时间。 - 双向链表:可以很容易地向前和向后遍历。
3. 常用函数
push_back
/push_front
pop_back
/pop_front
begin
/end
empty
/size
insert
/erase
二、模拟实现简单的链表
为了更好地理解std::list
的工作原理,我们可以尝试使用C++实现一个简单的双向链表。
#include <iostream>
struct Node {
int data;
Node* prev;
Node* next;
Node(int value) : data(value), prev(nullptr), next(nullptr) {}
};
class MyList {
private:
Node* head;
Node* tail;
public:
MyList() : head(nullptr), tail(nullptr) {}
~MyList() {
while(head) {
Node* temp = head;
head = head->next;
delete temp;
}
}
void push_back(int value) {
Node* node = new Node(value);
if (!tail) {
head = tail = node;
} else {
tail->next = node;
node->prev = tail;
tail = node;
}
}
void push_front(int value) {
Node* node = new Node(value);
if (!head) {
head = tail = node;
} else {
head->prev = node;
node->next = head;
head = node;
}
}
void pop_back() {
if (!tail) return;
Node* temp = tail;
tail = tail->prev;
if (tail) tail->next = nullptr;
else head = nullptr;
delete temp;
}
void pop_front() {
if (!head) return;
Node* temp = head;
head = head->next;
if (head) head->prev = nullptr;
else tail = nullptr;
delete temp;
}
void print_list() const {
Node* current = head;
while(current) {
std::cout << current->data << " ";
current = current->next;
}
std::cout << std::endl;
}
};
int main() {
MyList myList;
myList.push_back(1);
myList.push_back(2);
myList.push_front(0);
myList.print_list(); // 输出: 0 1 2
myList.pop_front();
myList.print_list(); // 输出: 1 2
myList.pop_back();
myList.print_list(); // 输出: 1
return 0;
}
总结
std::list
是STL中用于双向链表的实现,支持快速插入和删除。- 不支持随机访问,适合需要频繁插入和删除的场景。
- 可以使用节点连接的方式来模拟实现链表,加深对其内部机制的理解。