STL之list

一. list介绍

1. 相对于vector是连续的线性空间,list是一个不连续的存储空间。每次在list中插入或删除一个元素,就配置一个或释放一个元素空间,因此list对于空间的使用有绝对的精准,一点都不会浪费的。

2. STL中list的结点结构,在STL中list是一个双向链表。list结点如下图所示

template<typename T>
struct _list_node{
    typedef void *void_pointer;
    void_pointer prev; //指向前面一个结点
    void_pointer next; //指向后面一个结点
    T data;  //数据
};

 

3. STL list是一个双向环状链表,list的类模板如下所示。结点结构和list的类模板是分开的。

template <class T, class Alloc = alloc>
class list{
protected:
    typedef _list_node<T> list_node;
public:
	typedef list_node* link_type;
protected:
    link_type node; //只要一个指针就可以表示环状链表
	...
};

4. STL中所有的区间都是满足“前闭后开”区间,因此list的示意图如下所示。链表的尾端有一个空白结点表示的是end,这样就可以满足STL规范的“前闭后开”区间。

 

二. list相关操作

1. 插入结点:在结点3的位置上插入结点99,此时结点99是插入在结点3的前面。通过find找到值为3的结点的位置,然后在那个位置插入值为99的结点。

2. 删除结点:删除值为1的结点,通过find找到元素值为1的结点的位置,然后删除之。

三. list使用例子

#include<list>
#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	//建立一个list
    list<int> ilist;
    cout<<"size = "<<ilist.size()<<endl; //size = 0 

    ilist.push_back(0);
	ilist.push_back(1);
	ilist.push_back(2);
    ilist.push_back(3);
	ilist.push_back(4);
	cout<<"size = "<<ilist.size()<<endl; //size = 5

	//迭代器
	list<int>::iterator it;
	for(it = ilist.begin(); it != ilist.end(); it++){
         cout<<*it<<" ";    // 0 1 2 3 4 5
    }
    cout<<endl;

    //查找插入值为99结点
    it = ilist.find(ilist.begin(), ilist.end(), 3);
	if(it != 0){
       ilist.insert(it, 99);
    }

    cout<<"size = "<<ilist.size()<<endl;   //size = 6
	cout<<*it<<endl;  //3,插入完成之后迭代器往后移动一位

	for(it = ilist.begin(); it != ilist.end(); it++){
         cout<<*it<<" ";    // 0 1 2 99 3 4 5
    }
    cout<<endl;

    //删除结点
	it = ilist.find(ilist.begin(), ilist.end(), 1);
	if(it != 0){
       ilist.erase(it);
    }
    for(it = ilist.begin(); it != ilist.end(); it++){
         cout<<*it<<" ";    // 0 2 99 3 4 5
    }
    cout<<endl;

    return 0;
}

四.list相关方法

时间: 2024-11-05 21:41:18

STL之list的相关文章

STL之Map

概述 Map是标准关联式容器(associative container)之一,一个map是一个键值对序列,即(key ,value)对.它提供基于key的快速检索能力,在一个map中key值是唯一的.map提供双向迭代器,即有从前往后的(iterator),也有从后往前的(reverse_iterator). map要求能对key进行<操作,且保持按key值递增有序,因此map上的迭代器也是递增有序的.如果对于元素并不需要保持有序,可以使用hash_map. map中key值是唯一的,如果马匹

c++,关于stl的应用,定义map

问题描述 c++,关于stl的应用,定义map 我想定义一个map容器,key是一个string,值是一个指向vector的指针,但是不同的string会对应不同类型的vector,这就不好定义了.求帮忙解决 解决方案 似乎没有很好的解决方案,因为stl是泛型,类型参数不同,就相当于两个不同的类型,不能存储在一个容器中.下面是一个勉强能用的方法,供你参考:可以用map<string void*>,然后再对void*强制类型转换,得到你想要的指针.前提是你已经知道每个string对应什么类型的指

STL学习笔记二(仿函式)

简介:<functional>文件包含的大量的模版类unary_function,binary_function,plus,miuns, multiplies, divides, modulus, negate, equal_to, not_equal_to, greater, less, greater_equal, less_equal, logical_and, logical_or, logical_not, unary_negate, binary_negate,binder1st,

STL stack应用

1. 概念  stack是一种LIFO(last-in first-out)的数据结构,其只允许在容器的尾部对数据进行操作,如下:  stack定义如下:  Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from the end

[经典面试题][百度]c++实现STL中的string类

题目 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能. 代码 /*------------------------------------- * 日期:2015-03-31 * 作者:SJF0115 * 题目: 实现string类 * 来源:百度 * 博客: ------------------------------------*/ #include <iostream> #include <cstring> us

STL中的sort和unique函数

问题描述 STL中的sort和unique函数 编了一个小程序,对STL算法中的sort()和unique()进行了测试,发现unique()输出结果不正确.程序如下: #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int array[8]={1,5,4,5,3,100,2,100}; vector<int> ivec(

VC6下使用STL注意:不要让内存分配失败导致您的旧版STL 应用程序崩溃

大多数 C++ 开发人员在他们的代码中都广泛使用了标准模块库 (STL).如果您是其中的一员,并且正在直接使用即装即用的 STL 和 Visual C++ 6.0,则在内存不足的条件下,您的应用程序就处于崩溃的高度危险的状况下.产生此问题的原因是,检查运算符 new 是否失败是一种非常少见的做法.更糟糕的是,当 new 确实失败时,响应不是标准的.有些语言编译器返回 NULL,而其他语言则引发异常. 另外,如果您正在 MFC 项目中使用 STL,要注意 MFC 有其自己的规则集.本文将讨论这些问

详细解说 STL 排序(Sort)

排序 一切复杂的排序操作,都可以通过STL方便实现 ! 0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思去考虑其算法原理,也不用再去验证其准确性.不过,等你开始应用计算机语言来工作的时候,你会发现,面对不同的需求你需要一次又一次去用代码重复实现这些已经成熟的算法,而且会一次又一次陷入一些由于自己疏忽而产生的b

结合泛型与模板的STL.NET探索

模板 开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择.而Visual C++ 2005,通过C++/CLI语言联编,引入了泛型的概念,使C++程序员可进一步提高程序的开发效率.关于 .NET泛型与C++模板,尽管句法上很相似,但泛型与模板是以完全不同的方法实现的,它们之间没有任何的内置兼容性. 说到泛型与模板的差别,相信每个 .NET平台的C++程序员都会问这个

一步一步学STL标准模板库

list 的使用 在使用list必须包括头文件#include <list>, 1).如何定义一个list对象 #include <list> int main (void) { list<char > cList; //声明了list<char>模板类 的一个实例 } 2).使用list的成员函数push_back和push_front插入一个元素到list中 cList. push_back('a'); //把一个对象放到一个list的后面 cList.