1.1.说明:
std::list是顺序容器是双向链表;提供双向迭代功能,但空间效率较低
双向链表元素都有一指针指向后一元素,也有一指针指向前一个元素
支持从容器中任何位置插入和删除元素。不支持快速随机访问。
添加,删除和移动列表中或多个列表中的元素不会使迭代器或引用无效。
仅当删除相应的元素时,迭代器才无效。
1.2.注意:
不支持使用下标随机存取元素
1.3.函数:
函数 | 实例 | 说明 |
构造函数 | ||
operator= | ||
assign(lst.begin(),lst.end()) | 分配 | |
get_allocator | 返回关联的分配器 | |
Element access元素访问 | ||
const int &front()const | lst.front(); | 返回数组首元素值 |
back() | lst.back(); | 访问最后一个元素 |
Iterators迭代器 | ||
begincbegin | 将迭代器返回到开头 | |
endcend | 将迭代器返回到末尾 | |
rbegincrbegin | 将反向迭代器返回到开头 | |
rendcrend | 将反向迭代器返回到末尾 | |
Capacity容量 | ||
bool empty() const; | 检查容器是否为空 | |
size_t lst.size() const; | 返回元素数 | |
size_t max_size() | 返回最大可能的元素数 | |
void resize(size_t newsize) | 更改存储的元素数 =size() | |
操作 | ||
void unique() | 删除连续的重复元素 | |
void remove(value) | 删除指定值,不存在忽略 | |
remove_if() | 删除满足特定条件的元素 | |
iterator erase(iterator position); | 删除迭代器所指元素;返回下一个元素的迭代器 | |
void pop_front() | 删除第一个元素 | |
void pop_back() | 删除最后一个元素 | |
erase(std::list) | ||
erase_if(std::list) | 擦除所有满足特定条件的元素 | |
clear() | 清除容器全部内容 | |
void push_front(const &T Val) | 元素插入头部; | |
void push_back(const &T Val) | 在末尾添加一个元素 | |
iter insert(iter pos, const &T val); | lst.insert(lst.begin()+2,0); | 在迭代器所指向元素前插入val |
void splice(iterator i, list <T> & x, iterator first, iterator last) | 在位置i前插入 x [first, last),x删除该区间。链表可是同一链表且i 不在 [first, last) | |
void merge(list <T> & x) | 合并x到尾部并清空 x。要求二个都是有序 | |
emplace(T value) | 就地构造元素 | |
emplace_front() | 在开始处就位构造一个元素 | |
emplace_back() | 在末尾就位构造一个元素 | |
Operations运作方式 | ||
void sort() | 对元素进行排序 | |
void reverse() | 反转元素的顺序 | |
swap(std::list) | 交换内容 |
2.实例
#include <iostream>
#include <list>
#include <assert.h>
using namespace std;
#define print_list(lst) \
{ cout << "["; \
for (auto v:lst) \
cout << v << ",";\
cout << "]" << endl; \
}
int main() {
//构造函数:
int arr[6] = { 1,3,2,5,2,3 };
int arr1[5] = {1,3,2,4,6 };
list<int> lst(arr, arr + 6);
list<int> lst1(arr1, arr1 + 5);
list<int> lst2{ 10,13,14 };
list<int> lst3 = lst2,lst4;
lst4.assign(lst2.begin(), lst2.end());
list<int>::iterator it;//it++;合法 it+1;不合法
//获取元素:
cout << lst.front() <<"="<< *lst.begin() << endl;//1 1首元素
cout << lst.back() << endl;//3 尾元素
cout << lst.size() <<","<<lst.max_size()<< endl;//6,768614336404564650
lst.resize(8);
cout << lst.size() << "," << lst.max_size() << endl;//10, 768614336404564650
assert(lst.empty() == false);
//删除:
lst.sort();
lst.unique(); print_list(lst);//删除相邻重复元素
lst.pop_front(); print_list(lst);//删除首元素
lst.remove(5); print_list(lst);//删除元素5,若不存在忽略
//排序:
lst.sort(); print_list(lst);
lst.reverse(); print_list(lst);//反序
//使用merge
lst.sort(); lst1.sort();
lst.merge(lst1); print_list(lst); print_list(lst1);//lst=slt+lst1 lst1=空
//附加:
print_list(lst4); print_list(lst2);
for(auto it=lst2.begin();it!=lst2.end();it++)//lst4=lst4+lst2;lst2不变
lst4.push_back(*it);
print_list(lst4); print_list(lst2);
//遍历元素:
for (auto it = lst.begin(); it != lst.end(); ++it) {
cout << *it << "," << endl;
}
return 0;
}