C++ STL List使用

一、简介

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
*/

 

posted on 2021-03-27 16:21  Hello-World3  阅读(193)  评论(0编辑  收藏  举报

导航