只是一篇超详细的c++ list用法总结罢了

1.简介

list是一个线性双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。使用时需要包含头文件<list>。

         

它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。由于其结构的原因,list 随机检索的性能非常的不好,因为它不像vector 那样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后,它的检索时间就越长。检索时间与目标元素的位置成正比。虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有所影响,这一点是vector 不可比拟的。

2.构造

#include <iostream>
#include <list>

int main ()
{
  // 下面介绍几种list的构造方法:
  std::list<int> first;                                // 空链表
  std::list<int> second (4,100);                       // 初始化4个值为1的的元素
  std::list<int> third (second.begin(),second.end());  // 通过迭代器范围初始化
  std::list<int> fourth (third);                       // 通过另一个list初始化

  // 也能通过数组进行初始化:
  int myints[] = {16,2,77,29};
  std::list<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

  std::cout << "The contents of fifth are: ";
  for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); it++)
    std::cout << *it << ' ';

  std::cout << '\n';

  return 0;
}

运行结果:
The contents of fifth are: 16 2 77 29  

3.成员函数

3.1迭代器:

begin() 指向第一个元素位置
end() 指向最后一个元素后一个位置
rbegin() 指向第一个元素之前一个位置
rend() 指向最后一个元素位置

3.2容量相关:

size() 返回容器大小
max_size() 返回容器最大容量
empty() 判断容器是否为空
resize() 调整容量大小,多则删少则补

3.3成员访问:

不支持随机访问,其迭代器只有++,--操作,没有+1,-1操作。

front()  返回第一个元素
back()  返回最后一个元素

 

 

 3.4元素调整:

assign(4,5) 对list重新赋值,4个5
assign(a.begin(),a.end()) 使用[a.begin(),a.end())范围的元素对list重新赋值
emplace_front () 向list前端插入元素(c++11新特性,效率比push_front高)
push_front() 向list前端插入元素
pop_front() 删除list第一个元素
emplace_back () 向list末尾插入元素(c++11新特性,效率比push_back高)
push_back() 向list末尾插入元素
pop_back() 删除list末尾元素
insert (iterator position, const value_type& val); 向position位置插入元素val
insert (iterator position, size_type n, const value_type& val); 向position位置插入n个val
insert (iterator position, InputIterator first, InputIterator last); 在position位置插入[first,last)范围的元素
emplace() 同insert在position位置插入val的方法(c++11,效率比insert高)
erase() 删除指定位置元素:erase (iterator position); 删除位置范围元素:erase (iterator first, iterator last);
swap() 交换两个list:list1.swap(list2)
clear() 清空list

3.5相关操作:

sort() 排序,默认从小到大
reverse() 前后反转元素
remove() 删除所有指定值的元素,remove(val):删除list中所有值为val的元素
splice() 功能有点类似insert,但是插入后原来的list被清空(因为是直接将list2接入list1中)
merge() 将两个list按大小顺序合并,如果没有顺序需指定排序函数

下面看一下splice的使用例子: 

#include <iostream>
#include <list>

int main ()
{
  std::list<int> mylist1, mylist2;
  std::list<int>::iterator it;

  // 设置一些初始值:
  for (int i=1; i<=4; ++i)
     mylist1.push_back(i);      // mylist1: 1 2 3 4

  for (int i=1; i<=3; ++i)
     mylist2.push_back(i*10);   // mylist2: 10 20 30

  it = mylist1.begin();
  ++it;                         // points to 2

  mylist1.splice (it, mylist2); // mylist1: 1 10 20 30 2 3 4
                                // mylist2 (empty)
                                // "it" still points to 2 (the 5th element)
                                          
  mylist2.splice (mylist2.begin(),mylist1, it);
                                // mylist1: 1 10 20 30 3 4
                                // mylist2: 2
                                // "it" is now invalid.
  it = mylist1.begin();
  std::advance(it,3);           // "it" points now to 30

  mylist1.splice ( mylist1.begin(), mylist1, it, mylist1.end());
                                // mylist1: 30 3 4 1 10 20

  std::cout << "mylist1 contains:";
  for (it=mylist1.begin(); it!=mylist1.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  std::cout << "mylist2 contains:";
  for (it=mylist2.begin(); it!=mylist2.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

 

4.非成员函数

1.swap(list1,list2),交换两个list,STL通用算法

2.重载了==,!=,<,>,<=,>= 比较运算符
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章