全国学校网站建设,中山企业网站推广公司,中华南大街网站建设,虚拟主机网站国庆放假第三天#xff0c;今天把stl的list学完。
lsit是一个带头双向循环链表。
遍历
list也可以用迭代器#xff0c;范围for进行遍历#xff0c;没有operator[ ]。
迭代器 listint s1;s1.push_back(1);s1.push_back(2);s1.push_back(3);s1.push_back(4);list今天把stl的list学完。
lsit是一个带头双向循环链表。
遍历
list也可以用迭代器范围for进行遍历没有operator[ ]。
迭代器 listint s1;s1.push_back(1);s1.push_back(2);s1.push_back(3);s1.push_back(4);listint::iterator it s1.begin();while (it ! s1.end()){cout *it ;it;}cout endl; 范围for
listint s1;s1.push_back(1);s1.push_back(2);s1.push_back(3);s1.push_back(4);for (auto ch : s1){cout ch ;}cout endl; 逆置
逆置使用reverse():
listint s1;s1.push_back(1);s1.push_back(2);s1.push_back(3);s1.push_back(4);s1.reverse();for (auto ch : s1){cout ch ;}cout endl; 交换
swap
用来交换两个list底层实现就是把连个list的头结点指针交换一下指向 listint s1;s1.push_back(1);s1.push_back(2);s1.push_back(3);s1.push_back(4);listint s3;s3.push_back(4);s3.push_back(3);s3.push_back(2);s3.push_back(1);s1.swap(s3);cout s1: ;for (auto ch : s1){cout ch ;}cout endl;cout s3: ;
for (auto ch : s3)
{cout ch ;
}
cout endl; 删除
remove
可以直接用remove删除指定的值 listint s1;s1.push_back(1);s1.push_back(2);s1.push_back(3);s1.push_back(4);s1.remove(3);for (auto ch : s1){cout ch ;}cout endl; pop_back()
pop_back只能尾删并且不能传参 listint s1;s1.push_back(1);s1.push_back(2);s1.push_back(3);s1.push_back(4);s1.pop_back();for (auto ch : s1){cout ch ;}cout endl; 快排
升序
list可以使用sort()进行快速排序 listint s1;s1.push_back(4);s1.push_back(3;s1.push_back(2);s1.push_back(1);s1.sort();for (auto ch : s1){cout ch ;}cout endl; vector也可以进行快排但是vector没有sort这个成员算法库里有包一下算法库的头文件
#include algorithm
然后看一下算法库里面的sort的用法
可以看出来可以把vector的区间传给sort进行排序 vectorint s2;s2.push_back(4);s2.push_back(3);s2.push_back(2);s2.push_back(1);sort(s2.begin(), s2.end());for (auto ch : s2){cout ch ;}cout endl; 如果list用算法库里的这个sort就会报错 sort(s1.begin(), s1.end());for (auto ch : s1){cout ch ;}cout endl;这是因为迭代器有好几种特性 我们可以看一下sort和reverse:
vector是单链表所以可以用sortlist是双链表不能用sort只能用reverse()。但是vector可以用reverse();也就是单向的容器可以用随机的迭代器和双向迭代器双向的容器只能用双向得迭代器。 降序
sort用了一个less仿函数实现升序用greater实现降序
greaterint il;s1.sort(il); 也可以用匿名对象的方式 //greaterint il;//s1.sort(il);s1.sort(greaterint()); list sort和vector sort效率对比
如果数据少的话可以用list的sort进行排序如果数据太多就不行了。我们可以实验一下写一段如下代码
void test2()
{srand((size_t)time(0));const size_t N 100000;vectorint v;v.reserve(N);listint lit1;listint lit2;for (size_t i 0; i N; i){auto e rand;v.push_back((int)e);lit1.push_back((int)e);}int begin1 clock();sort(v.begin(), v.end());int end1 clock();int begin2 clock();lit1.sort();int end2 clock();cout vector sort: end1 - begin1 endl;cout list sort: end2 - begin2 endl;}这段代码就是看一下vector进行快排和list进行快排的效率对比的
可以看出list用快排占用栈帧比vecto使用快排大的多。因为vector是线性表list是链表。
我们也可以让list1 sort一下然后把list2给vector 进行代跑等vector sort完再拷贝回来 然后对比list1和lit2的效率
void test2()
{srand((size_t)time(0));const size_t N 1000000;//vectorint v;//v.reserve(N);listint lit1;listint lit2;for (size_t i 0; i N; i){auto e rand;lit2.push_back((size_t)e);lit1.push_back((size_t)e);}int begin1 clock();vectorint v(lit2.begin(), lit2.end());sort(v.begin(), v.end());lit1.assign(v.begin(), v.end());int end1 clock();int begin2 clock();lit1.sort();int end2 clock();cout list-vector sort: end1 - begin1 endl;cout list sort: end2 - begin2 endl;
} 可以看出明显经过vector 代跑的list2更快. 去重
去重就是去掉重复的值 listint s3;s3.push_back(5);s3.push_back(4);s3.push_back(3);s3.push_back(2);s3.push_back(1);s3.push_back(1);s3.push_back(1);s3.unique();for (auto ch : s3){cout ch ;}cout endl; 但是如果是无序的就不行无序的需要先排序才能去重 listint s3;s3.push_back(5);s3.push_back(4);s3.push_back(1);s3.push_back(3);s3.push_back(2);s3.push_back(1);s3.push_back(1);s3.sort(greaterint());s3.unique();for (auto ch : s3){cout ch ;}cout endl; 接合
for (int i 1; i 4; i)mylist1.push_back(i); // mylist1: 1 2 3 4for (int i 1; i 3; i)mylist2.push_back(i * 10); // mylist2: 10 20 30it mylist1.begin();it; // points to 2mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4// mylist2 (empty)// it still points to 2 (the 5th element)mylist2.splice(mylist2.begin(), mylist1, it);// mylist1: 1 10 20 30 3 4// mylist2: 2