注意:list和forward_list都有自己的sort排序方法,所以排序时最好使用自带的sort方法,节省时间

一:List

(一):List双向链表简介

05--STL序列容器(List和Forward_list)

list是一个双向链表容器,可高效地进行插入删除元素。
list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。It++(ok) it+5(err)
list不支持任意存取迭代

05--STL序列容器(List和Forward_list)

(二):list默认构造函数

list采用采用模板类实现,对象的默认构造形式:list<T> lstT;  如:

list<int> lstInt;            //定义一个存放int的list容器。

list<float> lstFloat;     //定义一个存放float的list容器。

list<string> lstString;     //定义一个存放string的list容器。        

//尖括号内还可以设置指针类型或自定义类型。

(三):list的带参构造函数

list(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
list(n,elem);   //构造函数将n个elem拷贝给本身。
list(const list &lst);  //拷贝构造函数。

(四):list头尾添加删除操作

list.push_back(elem);            //在容器尾部加入一个元素
list.pop_back();              //删除容器中最后一个元素
list.push_front(elem);     //在容器开头插入一个元素
list.pop_front();              //从容器开头移除第一个元素

(五):list头尾数据获取

list.front();   //返回第一个元素。
list.back();  //返回最后一个元素。

(六):list迭代器相关

list.begin();                     //返回容器中第一个元素的迭代器。
list.end();                       //返回容器中最后一个元素之后的迭代器。
list.rbegin();         //返回容器中倒数第一个元素的迭代器。
list.rend();         //返回容器中倒数最后一个元素的后面的迭代器。

(七):list赋值操作

list.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
list.assign(n,elem);  //将n个elem拷贝赋值给本身。
list& operator=(const list &lst);         //重载等号操作符
list.swap(lst);  // 将lst与本身的元素互换。

(八):list大小获取

list.size();      //返回容器中元素的个数
list.empty();           //判断容器是否为空
list.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
list.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

(九):list插入操作

list.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
list.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
list.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。
同链表一样,先是查找位置,耗时。后是插入数据,快速

(十):list删除区间数据

list.clear();          //移除容器的所有数据
list.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。  //使用迭代器删除较快,不需要查找
list.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。
lst.remove(elem);   //删除容器中所有与elem值匹配的元素。

(十一):list数据序列翻转《重点》

lst.reverse();     //反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
只动指针,不动数据

(十二)性能测试

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <cstring>

#if _MSC_VER
#define snprintf _snprintf
#endif

using namespace std;

long get_a_target_long()
{
    /******变量声明********/
    long target = 0;
    /**********************/

    cout << "targer (0~" << RAND_MAX << "):";
    cin >> target;
    return target;
}

string get_a_target_string()
{
    /******变量声明********/
    long target = 0;
    char buf[10];
    /**********************/

    cout << "targer (0~" << RAND_MAX << "):";
    cin >> target;

    snprintf(buf, 10, "%d", target);
    return string(buf);
}

//与后面的比较函数中回调参数对应
int compareLongs(const void* l1, const void* l2)
{
    return (*(long*)l1 - *(long*)l2);
}

int compareStrings(const void* s1, const void* s2)
{
    if (*(string*)s1 > *(string*)s2)
        return 1;
    if (*(string*)s1 < *(string*)s2)
        return -1;
    return 0;
}
公共函数

相关文章: