一,list容器基本概念

1.list容器基本知识

  • list容器的底部数据结构为双向链表,可以高效的进行插入和删除元素。
  • list因为底层数据结构是双向链表,因此不支持下标操作和.at()函数的操作。要获取元素,必须从头到尾遍历。
  • 使用list容器必须引入头文件# include<list>。

二,list容器构造函数

1.无参构造函数

// 无参构造函数
list<string> l1;

2.有参构造函数

// 有参构造函数,10个字符'A'来初始化容器
list<char> l2(, 'A');
// 有参构造函数,用上面的容器初始化下面的容器
list<char> l3(l2.begin(), l2.end());

3.拷贝构造函数

// 有参构造函数
list<char> l1(, 'A');
// 拷贝构造函数
list<char> l2 = l1;

4.析构函数

  list的析构函数用来释放容器中元素所占用的内存。

三,list容器的操作符重载

1.赋值操作符

// 定义链表容器l1
list<string> l1(, "HelloWorld");
// 定义链表容器l2
list<string> l2;
// 赋值操作符重载
l2 = l1;

四,list容器的成员函数

1.头部插入和删除元素

// 定义容器
list<string> l1;
// 在容器头部添加元素
l1.push_front("Hello");
l1.push_front("World");
l1.push_front("C++");
// 移除容器头部元素
l1.pop_front();

2.尾部插入和删除元素

// 定义容器
list<string> l1;
// 在容器尾部添加元素
l1.push_back("Oracle");
l1.push_back("IBM");
l1.push_back("Microsoft");
// 移除容器尾部元素
l1.pop_back();

3.容器的头部和尾部元素

// 定义容器
list<string> l1;
// 在容器头部添加元素
l1.push_front("Hello");
l1.push_front("World");
l1.push_front("C++");
// 获取容器的头部和尾部元素
string first = l1.front();
string last = l1.back();

4.容器的大小

// 定义容器
list<string> l1;
// 在容器头部添加元素
l1.push_front("Hello");
l1.push_front("World");
l1.push_front("C++");
// 获取容器的大小
int size = l1.size();

5.容器的清空

// 定义容器
list<string> l1(,"HelloWorld");
// 容器的清空
l1.clear();

6.容器是否为空

// 定义容器
list<string> l1(,"HelloWorld");
// 容器是否为空
bool isEmpty = l1.empty();

7.容器的插入元素

// 定义容器l2
list<string> l2(, "HelloWorld");
// 在容器第二个位置插入"HelloC++",list只支持++和--,不支持具体的加几和减几,因为底层是链表
l2.insert(++l2.begin(), "HelloC++");
// 基于list容器的特征,经常配合迭代器来插入
for (list<string>::iterator it = l2.begin(); it != l2.end(); it++)
{
l2.insert(it, "H");
}

8.容器的删除元素

// 定义容器l2
list<string> l2(, "HelloWorld");
// 删除容器的所有元素
l2.erase(l2.begin(), l2.end());
// 根据容器元素的值删除
l2.remove("HelloC++");

9.容器的遍历

// 定义容器
list<string> l2(,"HelloWorld");
// 增强for遍历
for (string tmp : l2)
{
cout << tmp << " " ;
}
cout << endl;
// 正向遍历
for (list<string>::iterator it = l2.begin(); it != l2.end(); it++)
{
cout << *it << " ";
}
cout << endl;
// 反向遍历
for (list<string>::reverse_iterator it = l2.rbegin(); it != l2.rend(); it++)
{
cout << *it << " ";
}
cout << endl;

10.容器的反转

// 定义容器
list<string> l1;
// 在容器头部添加元素
l1.push_front("Hello");
l1.push_front("World");
l1.push_front("C++");
// 容器的反转
l1.reverse();

11.list的遍历删除

# include<iostream>
# include<list>
using namespace std; int main()
{
// 定义容器
list<int> v;
// 添加数据
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
// 这里注意不需要++it
for (list<int>::iterator it = v.begin(); it != v.end();)
{
// 删除偶数
if (*it % == )
{
// erase删除该元素后返回下一个元素的迭代器
it = v.erase(it);
}
else {
it++;
}
}
// 遍历
for (int tmp : v)
{
cout << tmp << " ";
}
cout << endl; return ;
}

五,list容器注意事项

1.存储自定义数据类型的注意

  要存储的自定义类型必须提供拷贝构造函数,因为容器是通过值的复制方式将元素存入到容器中的。

2.list容器的访问

  list容器不支持随机存取元素,即不支持索引下标的方式访问和修改元素,要想访问元素必须通过迭代器进行遍历,遍历到要找到的位置。

3.list容器的迭代器

  • list容器的迭代器不支持具体数据的加减,只支持++和--操作。
  • list的erase函数删除迭代器指向的元素后返回下一个迭代器。

STL序列式容器之list的更多相关文章

  1. C++ 序列式容器之vector

     什么是容器 容器,顾名思义,是用来容放东西的场所.C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的.众所周知,常用的数据结构不外乎:数组array,  链表list,  树tree ...

  2. STL关联式容器之set和multiset

    一,set和multiset的基础知识 1.set和multiset的基础 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的.所以不能指 ...

  3. STL关联式容器之map和multimap

    一,map和multimap的概念 1.map和multimap的基本知识 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中 ...

  4. STL关联式容器之set\map ----以STL源码为例

    关联式容器的特征:所用元素都会根据元素的键值自动被排序. set STL 中的关联式容器低层数据结构为红黑树,其功能都是调用低层数据结构中提供的相应接口. set元的元素不会像map那样同时拥有键(k ...

  5. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  6. STL——序列式容器

    一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...

  7. 数据结构-STL序列式容器总结

    根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...

  8. STL的六大容器之iterator----自定义范式

    STL的iterator组件,分离了容器和算法. 一.规定 在STL体系下定义iterator,要满足规定的一些规范: 1.iterator_category 有5中分类,决定胃具体的操作,如:++, ...

  9. STL序列式容器

    1.vector      空间运用的灵活性.      实现技术——关键是对大小的控制以及重新配置时的数据移动效率.      配置新空间.数据移动.释还旧空间      erase(int pos ...

随机推荐

  1. ElasticSearch 2.4

    ES是一个基于Lucene的分布式全文搜索服务器,和SQL Server的全文索引(Fulltext Index)有点类似,都是基于分词和分段的全文搜索引擎,具有分词,同义词,词干查询的功能,但是ES ...

  2. html5 10大html5前端框架

    Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...

  3. 【hdu 6208】The Dominator of Strings

    [链接]h在这里写链接 [题意] 问你n个串里面有没有一个串,使得其余n-1个串都是他的子串. [题解] 后缀数组. 答案肯定是那个最长的串. 则,把那个串求一下Sa数组(注意仅仅那个最长的串求). ...

  4. [机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)

    引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等.主要学习资料来自Standford Andrew N ...

  5. js进阶 12-2 彻底弄懂JS的事件冒泡和事件捕获

    js进阶 12-2 彻底弄懂JS的事件冒泡和事件捕获 一.总结 一句话总结:他们是描述事件触发时序问题的术语.事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件 ...

  6. POJ 1251 Jungle Roads (zoj 1406) MST

    传送门: http://poj.org/problem?id=1251 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=406 P ...

  7. WordPress的后台功能菜单介绍与操作,WordPress后台说明

    WordPress网站的后台概况和登陆地址 网站都有个后台管理系统,通过网站后台,你可以改变你的网站外观,管理你网站的数据,给网站前台增加页面,文章,视频,图片或者其他功能. 通过WordPress建 ...

  8. 1. java.util.concurrent - Java 并发工具包

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  9. android安卓开发基础小笔记,添加按钮事件,打开新窗体,窗体传值,回传

    给一个按钮添加onclick事件 //获取按钮对象 Button Aiyo = (Button)findViewById(R.id.button1); Aiyo.setOnClickListener( ...

  10. eclipse 远程debug tomcat web项目

    1.首先须要在linux系统tomcat/bin文件夹下配置catalina.sh这个文件里添加: CATALINA_OPTS="-Xdebug  -Xrunjdwp:transport=d ...