链表和list
STL的list是数据结构中的双向链表。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。
优点
可以在序列已知的任何位置快速插入或删除元素(时间复杂度为O(1))。并且在 list 容器中移动元素,也比其它容器的效率高。
缺点
它不能像 array 和 vector 那样,通过位置直接访问元素
使用方法
在使用该容器前需要包含下面两行代码
#include <list>
using namespace std;
注: std 命名空间也可以在使用 list 容器时额外注明,这两种方式都可以。
例
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
int k = 2;
list<int>mylist; //创建list容器
list<int>::iterator it;
for(int i=1;i<=k;i++>)
mylist.push_back(i)//赋值
while(mylist.size()>3){
int num = 1;
for(it=mylist.begin();it!=mylist.end();){
if(num++ % k == 0)
it = mylist.erase(it)
else
it++;
}
k==2?k=3:k=2;
}
for(it=mylist.begin();it!=mylist.end();it++){
if(it!=mylist.begin())
cout<<" ";
cout<<*it;
}
cout<<endl;
}
return 0;
}
list容器的创建
- 创建一个没有任何元素的空 list 容器:
std::list<int> values;
空的 list 容器在创建之后仍可以添加元素。
2. 创建一个包含 n 个元素的 list 容器:
std::list<int> values<10>
通过此方式创建 values 容器,其中包含 10 个元素,每个元素的值都为相应类型的默认值(int类型的默认值为 0)。
3. 创建一个包含 n 个元素的 list 容器,并为每个元素指定初始值。
std::list<int> values(10, 5);
通过此方式就创建了一个包含 10 个元素并且值都为 5 个 values 容器。
4. 在已有 list 容器的情况下,通过拷贝该容器可以创建新的 list 容器。
std::list<int> value1(10);
std::list<int> value2(value1);
注意,采用此方式,必须保证新旧容器存储的元素类型一致。
5.通过拷贝其他类型容器(或者普通数组)中指定区域内的元素,可以创建新的 list 容器。
//拷贝普通数组,创建list容器
int a[] = { 1,2,3,4,5 };
std::list<int> values(a, a+5);
//拷贝其它类型的容器,创建 list 容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::list<int>values(arr.begin()+2, arr.end());//拷贝arr容器中的{13,14,15}
list容器可用的成员函数
成员函数 | 功能 |
---|---|
begin() | 返回指向容器中第一个元素的双向迭代器。 |
end() | 返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。 |
rbegin() | 返回指向最后一个元素的反向双向迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
crbegin() | 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
crend() | 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素 |
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false |
size() | 返回当前容器实际包含的元素个数。 |
max_size() | 返回容器所能包含元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数 |
front() | 返回第一个元素的引用 |
back() | 返回最后一个元素的引用 |
assign() | 用新元素替换容器中原有内容 |
emplace_front() | 在容器头部生成一个元素。该函数和 push_front() 的功能相同,但效率更高。 |
push_front() | 在容器头部插入一个元素。 |
pop_front() | 删除容器头部的一个元素。 |
emplace_back() | 在容器尾部直接生成一个元素。该函数和 push_back() 的功能相同,但效率更高。 |
push_back() | 在容器尾部插入一个元素 |
pop_back() | 删除容器尾部的一个元素 |
emplace() | 在容器中的指定位置插入元素。该函数和 insert() 功能相同,但效率更高。 |
insert() | 在容器中的指定位置插入元素 |
erase() | 删除容器中一个或某区域内的元素。 |
swap() | 交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。 |
resize() | 调整容器的大小。 |
clear() | 删除容器存储的所有元素 |
splice() | 将一个 list 容器中的元素插入到另一个容器的指定位置。 |
remove(val) | 删除容器中所有等于 val 的元素 |
remove_if() | 删除容器中满足条件的元素。 |
unique() | 删除容器中相邻的重复元素,只保留一个。 |
merge() | 合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。 |
sort() | 通过更改容器中元素的位置,将它们进行排序 |
reverse() | 反转容器中元素的顺序。 |