链表(2):STL list

如果不是特殊要求,我们不必去写list的结构。
以C++为例,在STL中就有list,并且给出了很多方便的用法。

list<T> 容器模板定义在list头文件中,是T类型对象的双向链表。
它可以在常规时间内,在序列已知的任何位置插入或删除元素。

list的缺点是无法通过位置来直接访问序列中的元素。也就是说,不能索引元素。为了访问list内部的一个元素,必须一个一个地遍历元素,通常从第一个元素或最后一个元素开始遍历。

语法:

list<string> words;//声明一个空的列表
list<string> words {20};//声明一个默认元素个数为20的列表
list<double> values(10,2);//初始化为10个2的列表
list<double> copy_values {values};//将values赋给copy_values,对应“=”
//可以用另一个序列的开始和结束迭代器所指定的一段元素,来构造list容器的初始列表
list<double> samples {++cbegin(values),--cend(values)};

因为list容器的begin()和end()函数返回的都是双向迭代器,所以不能用它们加减整数。修改双向迭代器的唯一方式是使用自增或自减运算符。

可以通过调用list容器的成员函数size()来获取它的元素的个数,也可以使用它的resize()函数来改变元素个数。如果resize()的参数小于当前元素个数,会从尾部开始删除多余的元素。如果参数比当前元素个数大,会使用所保存元素类型的默认构造函数来添加元素。

list增加和插入元素:

可以使用list容器的成员函数push_front()在它的头部添加一个元素,调用一个push_back()可以在list容器的末尾添加一个元素。

list<string> words {"one","two"};
words.push_front("zero");
words.push_back("three");

emplace_front() 和 emplace_back() 更好(至于为什么,请自行百度):

words.emplace_front("zero");
words.emplace_back("three");

可以使用成员函数insert()在list容器内部添加元素。

  1. 可以在迭代器指定的位置插入一个新的元素:
list<int> data(10,8);
data.insert(++begin(data),6);//将6插入第2个的位置上
  1. 可以在给定位置插入几个相同元素:
auto iter=begin(data);
std::advance(iter,9);//将iter加9,因为它是双向迭代器,只能自增
data.insert(iter,3,8);//将3个8插入第10个的位置上
vector<int> numbers(10,5);
data.insert(--end(data),cbegin(numbers),cend(numbers));
//在倒数第二个位置上插入numbers
  1. 有三个函数可以在list容器中直接构造函数:
    1. emplace()函数在迭代器指定的位置构造一个元素,对应着insert()
    2. emplace_front()函数在list的第一个元素之前构造元素,对应着push_front()
    3. emplace_back()函数在list的尾部元素之后构造元素,对应着push_back()

list删除元素:

list容器的成员函数remove()则移除和参数匹配的元素:

std::list<int> numbers { 2, 5, 2, 3, 6, 7, 8, 2, 9};
numbers.remove(2);//删除所有等于2的元素

成员函数remove_if()期望传入一个一元断言作为参数。一元断言接受一个和元素同类型的参数或引用,返回一个bool值。断言返回true的所有元素都会被移除:

numbers.remove_if([](int n){return n%2==0;});//删除所有偶数
//5,3,7,9

这里的参数是一个lambda表达式,但也可以是一个函数对象。

成员函数unique()非常有意思,它可以移除连续的重复元素,只留下其中的一个:

list<string> words {"one","two","two", "two","three", "four", "four"};
words.unique();//Now contains "one","two","three","four"

注意:list排序不能使用algorithm中的sort()函数,因为此函数要求随机迭代器,而list只提供双向迭代器,但是list中有自己sort()函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值