如需转载,请注明出处。
感觉list无需说过多的内容,原理大家都懂得。直接调用接口就行了。因此熟悉如何用其成员函数,并在适当的时候用到它就行。
- List是一个连续的容器,而vector是一个非连续的容器,即list将元素存储在一个连续的内存中,而vector存储在一个非连续的内存中。
- 在Vector中间插入和删除是非常昂贵的,因为它需要花费大量时间来移动所有元素。 链表克服了这个问题,并使用list容器实现。
- list支持双向,为插入和删除操作提供了有效的方法。
- 遍历在列表中很慢,因为列表元素是顺序访问的,而向量支持随机访问。
list是允许非连续内存分配的序列容器。与向量相比,list具有慢遍历,但是一旦找到位置,插入和删除就很快。通常,当我们说list时,我们谈论双向链表。为了实现单链表,我们使用forward list。
list模板
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int> l;
}
它创建一个整数类型值的空列表。
list也可以使用参数初始化。
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int> l{1,2,3,4};
}
list可以通过两种方式初始化。
list<int> new_list{1,2,3,4};
or
list<int> new_list = {1,2,3,4};
下面是显示list的一些函数的工作情况:
#include <iostream>
#include <list>
#include <iterator>
using namespace std;
//function for printing the elements in a list
void showlist(list <int> g)
{
list <int> :: iterator it;
for(it = g.begin(); it != g.end(); ++it)
cout << '\t' << *it;
cout << '\n';
}
int main()
{
list <int> gqlist1, gqlist2;
for (int i = 0; i < 10; ++i)
{
gqlist1.push_back(i * 2);
gqlist2.push_front(i * 3);
}
cout << "\nList 1 (gqlist1) is : ";
showlist(gqlist1);
cout << "\nList 2 (gqlist2) is : ";
showlist(gqlist2);
cout << "\ngqlist1.front() : " << gqlist1.front();
cout << "\ngqlist1.back() : " << gqlist1.back();
cout << "\ngqlist1.pop_front() : ";
gqlist1.pop_front();
showlist(gqlist1);
cout << "\ngqlist2.pop_back() : ";
gqlist2.pop_back();
showlist(gqlist2);
cout << "\ngqlist1.reverse() : ";
gqlist1.reverse();
showlist(gqlist1);
cout << "\ngqlist2.sort(): ";
gqlist2.sort();
showlist(gqlist2);
return 0;
}
上述程序的输出是:
List 1 (gqlist1) is : 0 2 4 6
8 10 12 14 16 18
List 2 (gqlist2) is : 27 24 21 18
15 12 9 6 3 0
gqlist1.front() : 0
gqlist1.back() : 18
gqlist1.pop_front() : 2 4 6 8
10 12 14 16 18
gqlist2.pop_back() : 27 24 21 18
15 12 9 6 3
gqlist1.reverse() : 18 16 14 12
10 8 6 4 2
gqlist2.sort(): 3 6 9 12
15 18 21 24 27
与list一起使用的函数:
front() - 返回列表中第一个元素的值。
back() - 返回列表中最后一个元素的值。
push_front(g)- 在列表的开头添加一个新元素“g”。
push_back(g) - 在列表末尾添加一个新元素“g”。
pop_front() - 删除列表的第一个元素,并将列表的大小减小1。
pop_back() - 删除列表的最后一个元素,并将列表的大小减小1
begin() -返回一个指向列表第一个元素的迭代器
end() -返回一个迭代器,指向最后一个元素后面的理论最后一个元素。
rbegin() -返回一个反向迭代器,它指向列表的最后一个元素。
rend() -返回一个反向迭代器,它指向列表开头之前的位置。
cbegin() -返回一个指向列表开头的常量随机访问迭代器。
cend() -返回一个指向列表末尾的常量随机访问迭代器。
crbegin() -返回一个常量反向迭代器,它指向列表的最后一个元素,即容器的反向开头。
crend() -返回一个常量反向迭代器,它指向列表中第一个元素之前的理论元素,即列表的反向末尾。
empty() - 返回列表是空(1)还是不(0)。
insert() - 在元素之前的列表中插入新元素到指定位置。
erase() - 从列表中删除单个元素或一系列元素。
assign() - 通过替换当前元素并将列表调整大小,将新元素分配给列表。
remove() - 从列表中删除所有与给定元素相等的元素。
remove_if() -用于从列表中删除与作为函数参数给出的谓词或条件相对应的所有值。
reverse() - 反转列表。
size() - 返回列表中的元素数。
resize() -用于调整列表容器的大小。
sort() - 按递增顺序对列表进行排序。
max_size() -返回列表容器可容纳的最大元素数。
unique() -从列表中删除所有重复的连续元素。
emplace_front() -用于将新元素插入到列表容器中,新元素被添加到列表的开头。
emplace_back() -用于将新元素插入到列表容器中,新元素被添加到列表的末尾。
clear() -用于删除列表容器的所有元素,从而使其大小为0。
operator = -此运算符用于通过替换现有内容将新内容分配给容器。
swap() -此函数用于将一个列表的内容与另一个相同类型和大小的列表交换。
splice() -用于将元素从一个列表传输到另一个列表。
merge() -将两个排序列表合并为一个
emplace() -通过在给定位置插入新元素来扩展列表。