STL之list
原创
©著作权归作者所有:来自51CTO博客作者wx6405b2c488d4e的原创作品,请联系作者获取转载授权,否则将追究法律责任
List原理
首先呢,我们得说list是一个泛化的双向链表,支持各种频繁的插入删除操作,每次插入一个新的节点,都会动态分配一块对应大小的内存块,每次删除一个新的节点都会
release该对应内存大小,也就是说list对应内存当中是离散的。也就是说list是不支持随机访问的,自然也就没有再分配(realloc操作),自然也就没有可获得再分配之前的
capacity属性了,list对象,在没有指定元素个数之前,是不会分配内存的。
与我们所知的不太相符的是list不仅仅是一个双向链表,而且是一个环状双向链表,换句话说,list就是首尾相连的,要知道的是list链表的头结点是不存储任何数据的,她就是头结点,与我们第一次insert的节点并不是一个哦。。插入第一个节点之后,才进行扩展,总而言之,list双向环状链表就是首尾相连的啊
#include "stdafx.h"
#include<list>
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//list 容器初始化为4个元素大小,同时每个里面默认值都是5
list<int>m_hinstance(4,5);
//开始遍历查看是否是这样的
list<int>::iterator itr;
cout<<"第一次遍历结果\n";
for(itr=m_hinstance.begin();itr!=m_hinstance.end();itr++)
{
cout<<*itr<<endl;
}
//list的增加元素操作
cout<<"在末尾增加一个元素1之后的遍历";
m_hinstance.push_back(1);
for(itr=m_hinstance.begin();itr!=m_hinstance.end();itr++)
{
cout<<*itr<<endl;
}
return 0;
}
这样的话,push_back是不是就不对了?不明白...
#include "stdafx.h"
#include<list>
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//list 容器初始化为4个元素大小,同时每个里面默认值都是5
list<int>m_hinstance(4,5);
//开始遍历查看是否是这样的
list<int>::iterator itr;
cout<<"第一次遍历结果\n";
for(itr=m_hinstance.begin();itr!=m_hinstance.end();itr++)
{
cout<<*itr<<endl;
}
//list的增加元素操作
cout<<"在首部增加一个元素1之后的遍历";
m_hinstance.push_front(1);
for(itr=m_hinstance.begin();itr!=m_hinstance.end();itr++)
{
cout<<*itr<<endl;
}
return 0;
}
是不是发现push_front没有效果??
可如果在push_front之后再加一句push_front就可以了!!!
// LIst.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<list>
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//list 容器初始化为4个元素大小,同时每个里面默认值都是5
list<int>m_hinstance(4,5);
//开始遍历查看是否是这样的
list<int>::iterator itr;
cout<<"第一次遍历结果\n";
for(itr=m_hinstance.begin();itr!=m_hinstance.end();itr++)
{
cout<<*itr<<endl;
}
//删除第一一个元素
itr=m_hinstance.begin();
m_hinstance.erase(itr);//如果是有remove,则是删除其值是参数的所有元素
cout<<"删除第一个元素之后的遍历\n";
for(itr=m_hinstance.begin();itr!=m_hinstance.end();itr++)
{
cout<<*itr<<endl;
}
return 0;
}
删除元素还是没有问题的哈,只是查找,我就不说了,因为list在内存中是离散分布的不可能支持随机访问,其效率也是最低的,在这里除了遍历一遍我也没有别的方法了,在这就不说了
话说,list的push操作是不是还有问题?能力有限,在这儿就不多说了...