C++基础 – 容器 – list
list
std::list支持从容器的任何位置快速插入和删除元素,不支持随机访问。双向链表,头文件:<list>
定义:
template<
class T,
class Allocator = std::allocator<T>
> class list;
参数解释:
1. T 元素类型
T必须满足可拷贝复制(CopyAssignable)和可拷贝构造(CopyConstructible)的要求
2. Allocator 用于获取/释放内存及构造/析构内存中元素的分配器
常用函数
front()
reference front();
const_reference front() const;
返回容器的第一个元素的引用。空容器上行为未定义
back()
reference back();
const_reference back() const;
返回到容器中最后一个元素的引用。空容器上行为未定义
empty()
bool empty() const;
返回容器是否为空
size()
size_type size() const;
返回容器中元素个数
clear()
void clear();
删除容器内所有元素。调用后size()返回0
resize()
void resize(size_type count, T value = T());
重设容器的大小为count个元素。如果当前size()大于count,则在尾部增加元素,并以value的副本初始化。
insert()
iterator insert(iterator pos, const T& value); //(1)
void insert(iterator pos, size_type count, const T& value); //(2)
template<class InputIt>
void insert(iterator pos, InputIt first, InputIt last); //(3)
插入元素到容器的指定位置。
1. 在pos前插入value
2. 在pos前插入value的count个副本
3. 在pos前插入来自范围[first, last)的元素
emplace()
template<class... Args>
iterator emplace(const_iterator pos, Args&&... args); //c++11
直接在pos前插入元素到容器,通过std::allocator_traits::construct构造元素,将参数args…作为std::forward<Args>(args)…转发给构造函数。返回指向插入元素的iterator
erase()
iterator erase(iterator pos); //(1)
iterator erase(iterator first, iterator last); //(2)
从容器内删除指定元素,返回被移除元素之后的迭代器
1. 删除位于pos的元素
2. 删除范围[first, last)中的元素
push_back
void push_back(const T& value);
将元素value添加到容器尾部
emplace_back()
template<class... Args>
void emplace_back(Args&&... args); //c++11
添加新元素到容器尾部。通过std::allocator_traits::construct构造,参数args…以std::forward
pop_back()
void pop_back();
移除容器最后一个元素。在空容器上调用,行为未定义
push_front()
void push_front(const T& value);
将元素value添加到容器的头部
emplace_front
template<class... Args>
void emplace_front(Args&&... args);
插入元素到容器开始,通过std::allocator_traits::construct构造元素,将参数args…作为std::forward
pop_front()
void pop_front();
移除容器第一个元素,如果容器为空,则行为未定义
swap()
void swap(list& other);
将内容和other的交换
merge()
void merge(list& other); //(1)
template<class T>
void merge(list& other, Compare comp) //(2)
归并两个已排序链表为一个。操作后other变为空。
1. 使用operator< 归并
2. 使用comp 归并
splice()
void splice(const_iterator pos, list& other); //(1)
void splice(const_iterator pos, list& other, const_iterator it); //(2)
void splice(const_iterator pos, list& other, const_iterator first, const_iterator last); //(3)
从一个list转移元素给另一个。不复制或者移动元素,仅重值向链表节点的内部指针。
1. 从other转移所有元素到*this中,元素被插入到pos指向的元素之前。操作后容器other变成空。如果other和*this指代同一对象则行为未定义
2. 从other转移it所指代的元素到*this。元素被插入到pos所指向的元素之前。
3. 从other转移范围[first, last)中的元素到*this。元素被插入到pos所指向的元素之前。如果pos是范围[first, last)中的迭代器则行为未定义
reverse
cpp