C++ list模板类介绍

简介

List是一种可在常数时间内在任何位置执行插入和删除操作的顺序容器。list是双向链表,其迭代器是双向的。与其他顺序容器(array, vector, deque)相比,list容器在任意位置执行插入、提取、和移动元素的操作更高效,但它不能通过在容器中的位置直接获取元素。

成员函数

复制控制

list::list()

构造函数:构造一个新的list对象,根据参数初始化list容器的内容。

list::~list()

析构函数:销毁以list对象。

list::operator=

为容器分配新的内容,代替当前的内容,随之修改其大小。

示例代码

[cpp] view
plain
copy

  1. #include<iostream>
  2. #include<list>
  3. using namespace std;
  4. void
  5. print(list<int> l)
  6. {
  7. for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
  8. {
  9. cout << *it << "";
  10. }
  11. cout << endl;
  12. }
  13. int
  14. main(void)
  15. {
  16. // list::list()
  17. list<int> first;
  18. list<int> second(5, 10);
  19. list<int> third(second.begin(), second.end());
  20. list<int> fourth(third);
  21. int arr[] = {1, 2, 3, 4, 5};
  22. list<int> fifth(arr, arr + sizeof(arr)/sizeof(int));
  23. print(second);
  24. print(third);
  25. print(fourth);
  26. print(fifth);
  27. // list::operator=
  28. first = fifth;
  29. print(first);
  30. return(0);
  31. }

Iterator

list::begin()

返回一个迭代器,指向list的第一个元素。返回值类型:iterator/const_iterator。

list::end()

返回一个迭代器,指向list的最后一个元素的下一个位置。返回值类型:iterator/const_iterator。

list::rbegin()

返回一个反转迭代器,指向list的最后一个元素。返回值类型:reverse_iterator/reverse_const_iterator。

list::rend()

返回一个反转迭代器,指向list的第一个元素的前一个位置。返回值类型:reverse_iterator/reverse_const_iterator。

list::cbegin()

begin()的const版本。

list::cend()

end()的const版本

list::crbegin()

rbegin()的cosnt版本。

list::crend()

rend()的const版本。

示例代码

[cpp] view
plain
copy

  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. int
  5. main(void)
  6. {
  7. int arr[] = {1, 2, 3, 4, 5};
  8. list<int> l(arr, arr + sizeof(arr)/sizeof(int));
  9. // list::begin end
  10. for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
  11. {
  12. cout << *it << " ";
  13. }
  14. cout << endl;
  15. // list::rbegin rend
  16. for(list<int>::reverse_iterator it = l.rbegin(); it != l.rend(); ++it)
  17. {
  18. cout << *it << " ";
  19. }
  20. cout << endl;
  21. // list::cbegin cend
  22. for(list<int>::const_iterator it = l.cbegin(); it != l.cend(); ++it)
  23. {
  24. cout << *it << " ";
  25. }
  26. cout << endl;
  27. // list::cbegin cend
  28. for(list<int>::const_reverse_iterator it = l.crbegin(); it != l.crend(); ++it)
  29. {
  30. cout << *it << " ";
  31. }
  32. cout << endl;
  33. return 0;
  34. }

Capacity

list::empty()

测试list是否为空,空返回true,否则返回false。

list::size()

返回list中元素个数。返回值类型list::size_type。

list::max_size()

返回list能够容纳元素的最大个数。返回值类型list::size_type。

示例代码

[cpp] view
plain
copy

  1. #include<iostream>
  2. #include<list>
  3. using namespace std;
  4. int
  5. main(void)
  6. {
  7. list<int> l(10, 20);
  8. // list::empty
  9. if(l.empty()){
  10. cout << "Listis empty" << endl;
  11. }else{
  12. cout << "Listis not empty" << endl;
  13. }
  14. cout << "Listsize : " << l.size() << endl;
  15. cout << "Listmax size : " << l.size() << endl;
  16. return(0);
  17. }

Element access

list::front()

返回list第一个元素的引用。返回值类型reference/const_reference。

list::end()

返回list最后一个元素的引用。返回值类型reference/const_reference。

示例代码

[cpp] view
plain
copy

  1. #include<iostream>
  2. #include<list>
  3. using namespace std;
  4. int
  5. main(void)
  6. {
  7. int arr[] = {1, 2, 3, 4, 5};
  8. list<int> l(arr, arr + sizeof(arr)/sizeof(int));
  9. // list::front
  10. cout << "Thefirst element is : " << l.front() << endl;
  11. // list::back
  12. cout << "Thesecond element is : " << l.back() << endl;
  13. return(0);
  14. }

Modifiers

list::assign()

为list分配新的内容,以代替当前内容,并随之改变其大小。

list::emplace_front()

在list的前端插入一个元素。插入的元素由其构造函数创建。

list::push_front()

在list的前端插入一个元素。与emplace_front()不同,它的插入方式是将一个已存在的元素复制或移动到list前端。

list::pop_front()

删除list的第一个元素。

list::emplace_back()

在list的末端插入一个元素。插入的元素由其构造函数创建。

list::push_back()

在list的末端插入一个元素。与emplace_back()不同,它的插入方式是将一个已存在的元素复制或移动到list末端。

list::pop_back()

删除list的最后一个元素。

list::emplace()

在指定位置插入一个元素。插入的元素由其构造函数创建。

list::insert()

在指定位置插入一个或多个元素。对于插入大量元素来说是非常高效的。

list::erase()

从list中删除指定位置的一个或一定范围的元素。

list::swap()

交换两个list中的元素。两个list类型必须相同,大小可以不同。

list::resize()

重新分配list的大小,使其能容纳指定数量的元素。

list::clear

删除list中的所有元素。

示例代码

[cpp] view
plain
copy

  1. #include<iostream>
  2. #include<list>
  3. #include<vector>
  4. using namespace std;
  5. void
  6. print(list<int> l)
  7. {
  8. for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
  9. {
  10. cout << *it << "";
  11. }
  12. cout << endl;
  13. }
  14. int
  15. main(void)
  16. {
  17. list<int> first;
  18. list<int> second;
  19. list<int> third;
  20. int arr[] = {1, 2, 3, 4, 5};
  21. // list::assign
  22. first.assign(5, 10);
  23. second.assign(first.begin(), first.end());
  24. third.assign(arr, arr + sizeof(arr)/sizeof(int));
  25. print(first);
  26. print(second);
  27. print(third);
  28. // list::emplace emplace_front emplace_back
  29. list<pair<int, char>> pl;
  30. pl.emplace_front(1, ‘a‘);
  31. pl.emplace_front(2, ‘b‘);
  32. pl.emplace_back(3, ‘c‘);
  33. pl.emplace(pl.end(), 4, ‘d‘);
  34. for(pair<int, char> x :pl)
  35. {
  36. cout<< x.first << "" << x.second << endl;
  37. }
  38. //list::push_front push_back
  39. third.push_front(10);
  40. third.push_back(20);
  41. print(third);
  42. // list::insert
  43. first.insert(first.begin(), 20);
  44. first.insert(first.end(), 2, 30);
  45. vector<int> vec(2, 40);
  46. first.insert(first.end(), vec.begin(), vec.end());
  47. print(first);
  48. // list::erase
  49. second.erase(second.begin());
  50. print(second);
  51. second.erase(++second.begin(), second.end());
  52. print(second);
  53. // list::swap
  54. second.swap(first);
  55. print(first);
  56. print(second);
  57. // list::resize
  58. third.resize(5);
  59. print(third);
  60. third.resize(10);
  61. print(third);
  62. third.resize(15, 100);
  63. print(third);
  64. // list::clear
  65. third.clear();
  66. cout << "Thesize of third is : " << third.size() << endl;
  67. return(0);
  68. }

Operations

list::splice()

将一个list A中的元素转移到list B的指定位置,并将A中被转移的元素删除。

list::remove()

将list中指定的元素删除。

list::remove_if()

根据判断条件删除list的元素,如果条件为真则删除该元素。

list::unique()

删除list中具有相同值的元素,只保留第一个。也可以根据条件删除具有相同条件的元素,只保留第一个。

list::merge()

合并两个list,在合并之前两个list应该先排序,合并之后的list依然有序。也可以自定义排序的条件。

list::sort()

对list中的元素进行排序,变更它们在容器中的位置。sort()还可以按给定条件进行排序。

list::reverse()

改变list中元素的顺序。

示例程序

[cpp] view
plain
copy

  1. #include<iostream>
  2. #include<cmath>
  3. #include<list>
  4. using namespace std;
  5. void
  6. print(list<int> l)
  7. {
  8. for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
  9. {
  10. cout << *it << "";
  11. }
  12. cout << endl;
  13. }
  14. bool
  15. single_dight(const int &val)
  16. {
  17. return val > 10;
  18. }
  19. bool
  20. is_near(int first, int second)
  21. {
  22. return(fabs(first - second) < 5);
  23. }
  24. bool
  25. reverse(int first, int second)
  26. {
  27. return((first -second) > 0);
  28. }
  29. int
  30. main(void)
  31. {
  32. list<int> first(2, 10);
  33. list<int> second(2, 20);
  34. list<int>::iteratorit;
  35. // list::splice
  36. it = first.begin();
  37. first.splice(it, second);
  38. print(first);
  39. if(second.empty())
  40. {
  41. cout << "Secondis empty" << endl;
  42. }
  43. else
  44. {
  45. cout << "Secondis not empty" << endl;
  46. }
  47. // it still point to 10(the 3th element)
  48. cout << *it << endl;
  49. second.splice(second.begin(), first, it);
  50. print(second);
  51. it = first.begin();
  52. advance(it, 2);
  53. print(first);
  54. first.splice(first.begin(), first, it, first.end());
  55. print(first);
  56. // list::remove
  57. cout << "Beforeremove : ";
  58. print(first);
  59. first.remove(10);
  60. cout << "Afterremove : ";
  61. print(first);
  62. // list::remove_if
  63. cout << "Beforeremove_if : ";
  64. first.push_back(10);
  65. print(first);
  66. first.remove_if(single_dight);
  67. cout << "Afterremove_if : ";
  68. print(first);
  69. // list::unique
  70. first.push_back(20);
  71. first.push_back(20);
  72. first.push_back(21);
  73. cout << "Beforecall unique() : ";
  74. print(first);
  75. first.unique();
  76. cout << "Aftercall unique() : ";
  77. print(first);
  78. cout << "Beforecall unique() : ";
  79. print(first);
  80. first.unique(is_near);
  81. cout << "Aftercall unique() : ";
  82. print(first);
  83. // list::merge
  84. first.push_back(5);
  85. first.push_back(12);
  86. first.sort();
  87. print(first);
  88. second.push_back(9);
  89. second.push_back(17);
  90. second.sort();
  91. print(second);
  92. first.merge(second);
  93. print(first);
  94. // list::sort
  95. first.sort(reverse);
  96. print(first);
  97. // list::reverse
  98. first.reverse();
  99. print(first);
  100. return(0);
  101. }

C++ list模板类介绍

时间: 2024-11-03 22:09:41

C++ list模板类介绍的相关文章

CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)

前言: 以下功能在国庆期就完成并提前发布了,但到今天才有时间写文介绍,主要是国庆后还是选择就职了,悲催的是上班的地方全公司都能上网,唯独开发部竟不让上网,是个局域网. 也不是全不能上,房间里有三台能上网的机子(两台笔记本+一台台式机),下载资料还得用公司的U盘再转到自己电脑,这种半封闭的环境,相当的让人不适应,有种欲仰天吐血的感觉. 这一周我都向三个带总的领导反映了上网问题,不过没啥响应,估计是没戏. 于是我只有把其中一台能上网的笔记本拿到自己桌子上去独自占用了,勉强也能上下网了,不过基于安全问

js模板引擎介绍搜集

js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTemplate等),如何从这么多纷繁的模板引擎中选择一款适合自己的呢,笔者最近对主流的js模板引擎(mustache,doT,juicer,artTemplate,baiduTemplate,Handlebars,Underscore)做了一番调研,分享出来希望对大家有用. 从这几个指标来比较js模板

如何用boost::serialization去序列化派生模板类(续)

在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. 先看看变异错误的代码(...看不出有错,但是编译就有错). 基类代码: class base_class { public: base_class(int m=0) : base_member_(0) {} virtual ~base_class() {} virtual void print_da

学艺不精而羞愧--论C++模板类的使用

自己断断续续地使用C++也有一段时间了,有些时候产生了自满的情绪,认为自己对C++的语言特性已经知道的差不多了,在语法方面没有什么难倒我的地方了,现在所要做的是根据实际问题编写程序,问题的难点在于算法的设计和分析,在于解决问题的策略了.然而今天下午的一次经历给自己当头一棒:永远不要自满,要保持一颗谦虚的学习的心. 1 问题的产生 我在实现[书][1]中219页的list的contiguous结构时,按照我的惯性,写了两个文件:rblist.h和rblist.cpp,分别为类定义和方法的具体实现.

C++智能指针模板类复习

//C++智能指针模板类复习 #include<iostream> #include<memory> using namespace std; //智能指针用于确保程序不存在内存和资源泄漏且是异常安全的. //C++98中提供了auto_ptr,C++11摒弃了auto_ptr,并提出了unique_ptr .shared_ptr.weak_ptr void show1() { int* p = new int(4); cout << *p << endl;

(转)JDBC模板类。

Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭. JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连 接做任何事情.State

浅谈JavaEE中的JDBC模板类的封装实现以及合理的建立项目包结构(一)

从今天开始我们一起来聊下有关,javaEE开发中的一些知识,JavaEE的开发用于企业级的开发,但是现在企业中一般也不会使用JDBC开发,大部分都是使用自己公司开发的一套的框架,但是这些框架的架构一般也是会模仿着有名JavaEE开源三大开发框架SSH(Struts2+Spring+Hibernate)或者现在也很流行的SSM开发框架(Spring+SpringMVC+MyBatis) 来进行深度定制以便于适合自己企业的实际开发需求.有的人曾说既然去公司又是重新学习一套框架,还有必要学习开源的三大

Google Test(GTest)使用方法和源码解析——模板类测试技术分析和应用

写C++难免会遇到模板问题,如果要针对一个模板类进行测试,似乎之前博文中介绍的方式只能傻乎乎的一个一个特化类型后再进行测试.其实GTest提供了两种测试模板类的方法,本文我们将介绍方法的使用,并分析其实现原理.(转载请指明出于breaksoftware的csdn博客) 应用 GTest将这两种方法叫做:Typed Tests和Type-Parameterized Tests.我觉得可能叫做简单模式.高级模式比较通用.先不管这些名字吧,我们看看怎么使用 简单模式(Typed Tests) 首先我们

C++中模板类使用友元模板函数

在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定实例的访问权的友元声明. (1)普通友元: template<class T> class A{ friend void fun(); //... };此例中fun可访问A任意类实例中的私有和保护成员 (2)一般模板友元关系 template<class type> class A{