std::list
是 C++ 标准库中的一个双向链表容器,定义在 <list>
头文件中。它支持在任意位置高效地插入和删除元素,但不支持随机访问。以下是 std::list
的基本用法和一些常见操作:
1. 包含头文件
#include <list>
2. 定义和初始化
std::list<int> myList; // 定义一个空的 list
std::list<int> myList2 = {1, 2, 3, 4, 5}; // 使用初始化列表初始化
3. 插入元素
myList.push_back(10); // 在末尾插入元素
myList.push_front(5); // 在开头插入元素auto it = myList.begin();
std::advance(it, 2); // 移动迭代器到第3个位置
myList.insert(it, 15); // 在指定位置插入元素
4. 删除元素
myList.pop_back(); // 删除末尾元素
myList.pop_front(); // 删除开头元素auto it = myList.begin();
std::advance(it, 2); // 移动迭代器到第3个位置
myList.erase(it); // 删除指定位置的元素myList.remove(10); // 删除所有值为10的元素
5. 访问元素
int firstElement = myList.front(); // 访问第一个元素
int lastElement = myList.back(); // 访问最后一个元素// 遍历 list
for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";
}
6. 大小和容量
bool isEmpty = myList.empty(); // 检查是否为空
size_t size = myList.size(); // 获取元素个数
7. 排序和反转
myList.sort(); // 对 list 进行排序
myList.reverse(); // 反转 list
#include <iostream>
#include <list>int main() {std::list<int> myList = {5, 3, 1, 4, 2};// 默认升序排序myList.sort();std::cout << "升序排序: ";for (int val : myList) {std::cout << val << " ";}std::cout << std::endl;// 自定义降序排序myList.sort([](int a, int b) {return a > b;});std::cout << "降序排序: ";for (int val : myList) {std::cout << val << " ";}std::cout << std::endl;return 0;
}
8. 合并和拼接
std::list<int> anotherList = {20, 30, 40};
myList.merge(anotherList); // 合并两个 list,合并后 anotherList 为空myList.splice(myList.begin(), anotherList); // 将 anotherList 的元素拼接到 myList 的开头
9. 其他操作
myList.unique(); // 删除连续重复的元素
myList.resize(10); // 调整 list 的大小
10. 示例代码
#include <iostream>
#include <list>int main() {std::list<int> myList = {1, 2, 3, 4, 5};myList.push_back(6);myList.push_front(0);for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;myList.remove(3);myList.sort();myList.reverse();for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
总结
std::list
是一个灵活的双向链表容器,适合频繁插入和删除操作的场景。由于它不支持随机访问,因此在需要随机访问时,std::vector
或 std::deque
可能是更好的选择。