最近学习c++设计模式,无意看到list容器这个用法,就捉摸着大致整理下。也方便以后自己学习着。
提起list,我们就必须谈到STL(standed template library--标准模板库),是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术。 从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。如果查阅任何一个版本的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便。
说了这么多,一句话概括,有了stl大大方便了研发人员的操作,现在言归正传。
list每次增加一个元素,不存在重新申请内存的情况,它的成本是恒定的。而vector每当增加关键元素的时候,都需要重新申请新的更大的内存空间,会调用元素的自身的复制构造函数,存在构造成本。在销毁旧内存的时候,会调用析构函数,存在析构成本。所以在存储复杂类型和大量元素的情况下,list比vector更有优势!另外list没有备份空间的概念,出入一个元素就申请一个元素的空间,所以它的迭代器不会失效 。
list<int>::iterator itor;
list<int> ilist;
vector<int>::difference_type cnt;
for(size_t mx=0;mx!=4;++mx)
{
ilist.push_back(mx);//在list的末尾添加元素
}
itor=ilist.begin();//返回指向第一个元素的迭代器
//判断是否是最后一个元素
while(itor!=ilist.end())
{
cout<< *itor++<<endl;
}
list<int>::iterator int_itor=find(ilist.begin(),ilist.end(),5);//查找这个链表里是否有元素5
cout <<"Result=" <<*int_itor << endl;
ilist.erase(int_itor);
while(!ilist.empty())
{
cout<<"Remove : " << ilist.front()<<endl;
ilist.pop_front();
}