STL学习记录(六):List

来源:互联网 发布:vb调用matlab工具箱 编辑:程序博客网 时间:2024/06/05 12:44

STL顺序容器List

List简介

List容器通过双向链表的形式来管理容器里的元素。这种方式表明他与Vector、Deque容器的不同。首先List不支持元素的随机访问,例如:你要访问第五个元素你必须先访问之前的四个。其次List的插入和移除操作更快。因为不需要移动元素它在任意位置的插入和移除操作的时间复杂度是常量。下面是List的常见操作:

迭代器

操作 说明 list.begin( ) 返回list的第一个元素的双向迭代器 list.end( ) 返回list的最后一个元素之后位置的双向迭代器 list.cbegin( ) 返回list的第一个元素的const型双向迭代器 list.cend( ) 返回list的最后一个元素之后位置的const型双向迭代器 list.rbegin( ) 返回list逆序的第的第一个元素的反向迭代器 list.rend( ) 返回list逆序的最后一个元素的反向迭代器 list.crbegin( ) 返回list逆序的第一个元素的const型反向迭代器 list.crend( ) 返回list逆序的最后一个元素的const型反向迭代器

容量

操作 说明 list.size( ) 返回list里面元素的个数 list.empty( ) 判断list是否为空 list.max_size( ) 返回list的最大的容量

直接访问

操作 说明 list.front( ) 返回第一个元素(不检查该元素是否存在) list.back( ) 返回最后一个元素(不检查该元素是否存在)

赋值类

操作 说明 swap(list1,list2) 交换list1list2 数据 list1.swap(list2) 交换list1与list中的所有数据 list.assign(n,elem) 将n个元素elem的拷贝赋值给list list.assign(beg,end) 将[beg,end)范围内的元素赋值给list list.assign({*x1,x2,……}) 将初始化列表中的所有元素都赋值给list

修改类

操作 说明 list.clear( ) 删除list中的所有元素 list.erase(pos) 删除位于pos的元素 list.erase(beg,end) 删除位于[beg,end)之间的元素 list.resize(num) 重置list的大小,若list变大则新增元素使用该元素默认构造函数构造 list.resize(num,elem) 重置list的大小,若list变大则新增元素使用elem 的拷贝 list.remove(val) 移除所有值为val的元素 list.remove_if(op) 移除listh中元素经过op后为true的所有元素 list.push_back(elem) 将elem加到list的末尾 list.push_front(elem) 将elem加到list的前面 list.pop_back( ) 移除list中的最后一个元素(不是返回该值) list.pop_front( ) 移除list中的第一个元素(不是返回该值) list.insert(pos,elem) 在pos之前插入elem的拷贝并返回该元素的位置 list,insert(pos,n,elem) 在pos之前插入nelem的拷贝并返回第一个拷贝的位置(当n==0返回pos list.insert(pos,beg,end) 将[beg,end)之间的元素插入到pos之前(当beg==end返回pos list.emplace(pos,args…) 将用参数args…初始化的元素插入到pos之前并返回该元素的位置c++11 list.emplace_back(args…) 将用参数args…初始化的元素添加到list的末尾(不返回任何值)c++11 list.insert(pos,{*x1,x2,}* 将列表{*x1,x2,}中所有元素的拷贝插入到*pos之前并返回第一个拷贝的位置(当为空时返回pos)c++11

特有的修改操作

操作 说明 list.unique( ) 移除所有连续的具有相同值的重复元素 list.unique(op 当元素的op操作为真时,移除所有连续的具有相同值的重复元素 list1.splice(pos,list2) 将list2中的所有元素移到list1的迭代器pos之前 list1.splice(pos,list2,pos2) 将list2迭代器Pos2所指元素移到list1迭代器pos之前 list1.splice(pos,list2,beg2,end2) list2中位与[beg2,end2)的所有元素移到list的pos之前 list.sort( ) 对所有元素进行排序采用符号 < list.sort(op) 对所有元素进行排序采用符号 op list1.merge(list2,op) 该操作必须保证list1与list2操作前有序,将list2中的所有元素移到list1中并保证依然有序 list1.merge(list2,op) 该操作必须保证list1与list2操作前有序,将list2中的所有元素移到list1中并保证依然有序,顺序由op操作符确定 list.reverse( ) 将list中的所有元素逆序

代码示例:

#include <iostream>#include <list>#include <algorithm>#include <iterator>using namespace std;int main( ){    list<int> list_temp = {1, 2, 3, 3, 4, 6, 1, 1, 5};    list<int> list_reverse = list_temp;    list_reverse.reverse();    cout<<"list_reverse: ";    copy(list_reverse.cbegin( ),list_reverse.cend( ),ostream_iterator<int>(cout," "));    cout<<endl;    list_temp.sort();    cout<<"list_sort: ";    copy(list_temp.cbegin( ),list_temp.cend( ),ostream_iterator<int>(cout," "));    cout<<endl;    list<int> list_merge = list_temp;     list_temp.unique();    cout<<"list_unique: ";    copy(list_temp.cbegin( ),list_temp.cend( ),ostream_iterator<int>(cout," "));    cout<<endl;    list_merge.merge(list_temp);    cout<<"list_merge: ";    copy(list_merge.cbegin( ),list_merge.cend( ),ostream_iterator<int>(cout," "));    cout<<endl;    return 0;}

运行结果:
list_reverse: 5 1 1 6 4 3 3 2 1
list_sort: 1 1 1 2 3 3 4 5 6
list_unique: 1 2 3 4 5 6
list_merge: 1 1 1 1 2 2 3 3 3 4 4 5 5 6 6

0 0