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

3次阅读

共计 1986 个字符,预计需要花费 5 分钟才能阅读完成。

一、前言

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;
   }

后果如下:

正文完
 0