关于c++:C-STL-list容器

一、前言

list容器,又称为双向链表容器,即该容器的底层是以双向链表的模式实现的,因而list容器中的元素能够扩散存储在内存空间里,而不是必须存储在一整块间断的内存空间中。
list容器中各个元素的前后程序是靠指针维系的,每个元素都有两个指针,别离指向它的前一个元素和后一个元素。第一个元素的前向指针总为 null,因为它后面没有元素;同样,尾部元素的后向指针也总为 null。
长处:能够在序列已知的任何地位疾速插入或删除元素(工夫复杂度为O(1))。并且在 list 容器中挪动元素,也比其它容器的效率高。
毛病:不能通过下标拜访元素,只能从容器中第一个元素或最初一个元素开始遍历容器,直到找到对应元素。
list 容器以模板类 list<T>(T 为存储元素的类型)的模式在<list>头文件中,并位于 std 命名空间中。应用时需蕴含头文件:

#include <list>
using namespace std;

二、初始化list容器

一共有5种形式创立list容器

①std::list<int> listInt;
②std::list<int> listInt(10);
③std::list<int> listInt(10, 5);
④std::list<int> listInt2(listInt);
⑤//拷贝一般数组,创立list容器
int a[] = { 1,2,3,4,5 };
std::list<int> listInt(a, a+5);
//拷贝其它类型的容器,创立 list 容器
std::array<int, 5> arrInt{ 11,12,13,14,15 };
std::list<int> listInt(arrInt.begin()+2, arr.end());

①创立空的list容器
②创立一个蕴含10个元素,默认值为0的list容器
③创立一个蕴含10个元素,初始值为5的list容器
④将以初始化的list容器进行拷贝创立新的list容器,须保障新旧容器存储的元素类型统一
⑤通过拷贝其余类型容器(或者一般数组)中指定区域内的元素,创立 list 容器

三、成员函数

这里不列举迭代器、增加和删除等相干的函数。

函数 性能
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false
size() 返回以后容器理论蕴含的元素个数
max_size() 返回容器所能蕴含元素个数的最大值,个别是 232-1
front() 返回第一个元素的援用
back() 返回最初一个元素的援用
assign() 用新元素替换容器中原有内容
swap(x,y) 替换两个容器中的元素,必须保障这两个容器中存储的元素类型是雷同的
resize() 调整容器的大小
splice() 将一个 list 容器中的元素插入到另一个容器的指定地位
merge() 合并两个当时已排好序的 list 容器,并且合并之后的 list 容器仍然是有序的
sort() 通过更改容器中元素的地位,将它们进行排序
reverse() 反转容器中元素的程序

四、实例

1、创立list容器

  std::list<int> listInt;
    listInt.push_back(31);
    listInt.push_back(27);
    listInt.push_back(29);

    std::cout << " listInt size: " << listInt.size() << std::endl;

    int i = 0;
    std::list<int>::iterator listIter = listInt.begin();
    for (; listIter != listInt.end(); listIter++)
    {
        std::cout << " listInt[" << i++ << "]=" << *listIter << std::endl;
    }

    listInt.sort();
    i = 0;
    listIter = listInt.begin();
    for (; listIter != listInt.end(); listIter++)
    {
        std::cout << " sort listInt[" << i++ << "]=" << *listIter << std::endl;
    }

   int nFront = listInt.front();
   int nBack = listInt.back();
   std::cout << " listInt front: " << nFront << " back: " << nBack << std::endl;

   std::list<int> listInt1{ 14,25,99 };
   listInt1.sort();
   listInt.merge(listInt1);
   i = 0;
   listIter = listInt.begin();
   for (; listIter != listInt.end(); listIter++)
   {
       std::cout << " merge listInt[" << i++ << "]=" << *listIter << std::endl;
   }

后果如下:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理