std::list 容器介绍及用法
1. std::list
std::list是 C++ 标准模板库(STL)中的一个顺序容器适配器,它提供了双向链表的数据结构。与 std::vector 不同,std::list 不存储连续的元素,因此它可以高效地在中间插入和删除元素,而不需要移动其他元素。
2. 特点
(1)动态大小:std::list 的大小可以在运行时动态改变。
(2)插入和删除操作:在任何位置插入和删除元素都非常高效。
(3)内存分配:std::list 会分散地分配内存,这有助于减少内存碎片。
(4)性能:访问元素的速度较慢(相对于 std::vector),因为需要遍历链表。
3. 基本用法
std::list 支持大多数标准的容器操作,如 push_back、push_front、pop_back、pop_front、insert、erase 等。
(1)声明一个 std::list
#include <list>
std::list<int> myList;
(2)插入元素
/** 在末尾插入 */
myList.push_back(10);
/** 在开头插入 */
myList.push_front(20);
/** 在特定位置插入 */
auto it = std::find(stringList.begin(), stringList.end(), "20");
if(it != stringList.end()){
stringList.insert(it, "30");
}
(3)删除元素
/** 删除末尾元素 */
myList.pop_back();
/** 删除开头元素 */
myList.pop_front();
/** 删除特定位置的元素 */
it = myList.begin();
it++; ///< 移动到第一个元素
myList.erase(it); ///< 删除当前指向的元素
(4)遍历 std::list
for(std::list<int>::iterator it = myList.begin(); it != myList.end(); ++it)
{
std::cout << *it << std::endl;
}
4. 例程
以下是一个简单的例程,演示了如何使用 std::list 来存储和操作字符串。
#include <iostream>
#include <list>
#include <algorithm>
int main()
{
std::list<std::string> stringList;
/** 插入字符串. */
stringList.push_back("Apple");
stringList.push_back("Banana");
stringList.push_back("Cherry");
/** 遍历并打印字符串. */
std::cout << "List before modification: ";
for (const auto& str : stringList) {
std::cout << str << " ";
}
std::cout << std::endl; ///< 在链表中间插入一个新的字符串.
auto it = std::find(stringList.begin(), stringList.end(), "Banana");
if(it != stringList.end()){
stringList.insert(it, "Date");
}
/** 删除一个字符串. */
stringList.remove("Banana");
/** 再次遍历并打印字符串. */
std::cout << "List after modification: ";
for (const auto& str : stringList) {
std::cout << str << " ";
}
std::cout << std::endl;
return 0;
}