Skip to main content
 首页 » 编程设计

C++ STL List使用

2022年07月19日29jirigala

一、简介

1. 资料位置,Reference:http://www.cplusplus.com/reference/list/list/

2. Lists将元素按顺序储存在链表中。与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。(vector支持快速随机访问)

3. 下面是几个list特有的函数

remove()    //从list删除元素 
remove_if() //按指定条件删除元素 
reverse()   //把list的元素倒转 
sort()      //给list排序 
unique()    //删除list中重复的元素

4. 对比 vector 和 list 在查询(随机检索)和维护(插入和删除)上的区别
(1) 查询
vector:由于 vector 中的元素是连续存储的,所以我们能够直接的访问第n个元素。
list:由于list中的元素不是在内存中连续存储的,下一个元素的内存地址保存在前一个元素中,所以我们必须一个一个的访问前面的元素,最后才能访问第n个元素。
(2) 维护
vector:在 vector 中插入/删除一个元素的话,我们需要移动插入/删除位置之后的所有元素。如果在vector插入/删除元素后有大量元素的情况下,这些移动和删除操作会大量的消耗CPU时间。
list:使用list进行这些操作的时候,其仅仅是修改插入/删除元素之前的元素到后一个元素的指针则可以完成这些操作,这样可以节约大量的CPU时间。

二、例子

1. int型测试链表

#include <list>  
#include <iostream>  
#include <algorithm>  
 
using namespace std;  
 
//用于提供回调 
void print(int num)  
{  
    cout << num << " ";  
}  
 
//用于提供回调  
bool IsOdd(int i)  
{  
    return ((i & 1) == 1);  
}  
 
int main()  
{  
    //1. 初始化  
    list<int> v; 
    list<int>::iterator iv; 
 
    v.assign(10, 2); //将10个值为2的元素赋到list中 
    cout << v.size() << endl; //返回list实际含有的元素数量 
    cout << "-----------1------------" << endl; 
 
    //2. 添加 
    v.push_front(666); 
    for (int i = 0; i < 10; i++){ 
        v.push_back(i); 
    } 
    for_each(v.begin(), v.end(), print);//需要#include <algorithm> 
    cout << endl; 
    cout << v.size() << endl; 
    cout << "-----------2------------" << endl; 
 
    //3. 插入及遍历、逆遍历和倒转 
    v.insert(v.begin() , 99);//不能+和-了 
    v.insert(v.end() , 88); 
 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    for_each(v.rbegin(), v.rend(), print);//在逆序迭代器上做++运算将指向容器中的前一个元素 
    cout << endl; 
    cout << "-----------3------------" << endl; 
 
    //一般遍历写法 
    for(iv = v.begin(); iv != v.end(); ++iv) 
    cout << *iv << " "; 
    cout << endl; 
    cout << "-----------4------------" << endl; 
 
    v.reverse(); 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    for_each(v.rbegin(), v.rend(), print); 
    cout << endl; 
    cout << "-----------5------------" << endl; 
 
    //4. 排序  
    v.sort();//为链表排序,默认是升序 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    cout << "-----------6------------" << endl; 
 
    //5. 删除  
    v.erase(v.begin()); 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    v.insert(v.begin() , 99);//还原 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    cout << "-----------7------------" << endl; 
 
    //删掉链表中所有重复的元素 
    v.unique(); 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    cout << "-----------8------------" << endl; 
 
    //去掉所有含2的元素 
    v.remove(2); 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    cout << "-----------9------------" << endl; 
 
    //删掉所有奇数 
    v.remove_if(IsOdd); 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    cout << "-----------10------------" << endl; 
 
    //掐头去尾 
    v.pop_front(); 
    v.pop_back(); 
    for_each(v.begin(), v.end(), print); 
    cout << endl; 
    cout << "-----------11------------" << endl; 
 
    //6. 查询 
    cout << v.front() << endl; 
    cout << v.back() << endl; 
    cout << "-----------12------------" << endl; 
 
    //7. 清空 
    v.clear(); 
    cout << v.size() << endl;//0 
    for_each(v.begin(), v.end(), print); //已经clear,v.begin()==v.end(),不会有任何结果。 
    cout << "-----------13------------" << endl; 
 
    return 0; 
} 
 
/* 
//运行结果 
# ./qq 
10 
-----------1------------ 
666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9  
21 
-----------2------------ 
99 666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 88  
88 9 8 7 6 5 4 3 2 1 0 2 2 2 2 2 2 2 2 2 2 666 99  
-----------3------------ 
99 666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 88  
-----------4------------ 
88 9 8 7 6 5 4 3 2 1 0 2 2 2 2 2 2 2 2 2 2 666 99  
99 666 2 2 2 2 2 2 2 2 2 2 0 1 2 3 4 5 6 7 8 9 88  
-----------5------------ 
0 1 2 2 2 2 2 2 2 2 2 2 2 3 4 5 6 7 8 9 88 99 666  
-----------6------------ 
1 2 2 2 2 2 2 2 2 2 2 2 3 4 5 6 7 8 9 88 99 666  
99 1 2 2 2 2 2 2 2 2 2 2 2 3 4 5 6 7 8 9 88 99 666  
-----------7------------ 
99 1 2 3 4 5 6 7 8 9 88 99 666  
-----------8------------ 
99 1 3 4 5 6 7 8 9 88 99 666  
-----------9------------ 
4 6 8 88 666  
-----------10------------ 
6 8 88  
-----------11------------ 
6 
88 
-----------12------------ 
0 
-----------13------------ 
 
*/

2. char*型测试list

#include<iostream> 
#include<string> 
#include<list> 
 
using namespace std; 
 
int main() 
{ 
    list<char *> li; 
    list<char *>::iterator iter; 
    li.push_back("123"); 
    li.push_back("456"); 
    li.push_back("789"); 
    for (iter = li.begin(); iter != li.end(); ++iter) { 
        cout << *iter << endl; 
    } 
    return 0; 
}  
 
/* 
//运行结果 
# ./pp 
123 
456 
789 
*/

本文参考链接:https://www.cnblogs.com/hellokitty2/p/14586111.html