List是比较常用的一种数据结构,也是STL种比较成熟的数据结构。
list是用双向链表实现的。
list中有一个关键点,这个节点是list.end()
好处:每次插入或删除一个元素,就配置或释放一个元素空间,因此list对空间的运用有绝对的精准,对于任何位置的的元素插入或元素移除,永远是常数级的;插入操作(insert)和接洽操作都不会造成原有的list迭代器失效.
缺点:不能保证在连续空间的分配,对数据的随机访问比较慢。
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int i;
list<int> ilist;
cout<<"size = "<<ilist.size()<<endl;
ilist.push_back(0);
ilist.push_back(1);
ilist.push_back(2);
ilist.push_back(3);
cout<<"size = "<<ilist.size()<<endl;
list<int>::iterator ite;
for(ite = ilist.begin();ite!=ilist.end();++ite)
{
cout<<*ite<<endl;
}
cout<<endl;
ite = find(ilist.begin(),ilist.end(),3);
if(ite!= ilist.end())
ilist.insert(ite,99);
cout<<"size = "<<ilist.size()<<endl;
cout<<*ite<<endl;
for(ite= ilist.begin(); ite!=ilist.end();++ite)
{
cout<<*ite<<" ";
}
cout<<endl;
ite = find(ilist.begin(),ilist.end(),1);
if(ite!=ilist.end())
{
cout<<*(ilist.erase(ite))<<endl;
}
for(ite= ilist.begin(); ite!=ilist.end();++ite)
{
cout<<*ite<<" ";
}
cout<<endl;
int iv[5] ={5,6,7,8,9};
list<int> ilist2(iv,iv+5);
ite = find(ilist.begin(),ilist.end(),99);
ilist.splice(ite,ilist2);
ilist.reverse();
ilist.sort();
for(ite= ilist.begin(); ite!=ilist.end();++ite)
{
cout<<*ite<<" ";
}
return 0;
}
list中有自己的sort算法,而且时间复杂度是O(n*lg n),空间复杂度O(1)。
template <class T, class Alloc>
void list<T, Alloc>::sort() {
//以下判断,如果是空链表,或仅有一个元素,就不进行任何操作
if (node->next == node || link_type(node->next)->next == node) return;
list<T, Alloc> carry;
list<T, Alloc> counter[64];
int fill = 0;
while (!empty()) {
carry.splice(carry.begin(), *this, begin());
int i = 0;
while(i < fill && !counter[i].empty()) {
counter[i].merge(carry);
carry.swap(counter[i++]);
}
carry.swap(counter[i]);
if (i == fill) ++fill;
}
for (int i = 1; i < fill; ++i) counter[i].merge(counter[i-1]);
swap(counter[fill-1]);
}
本文是自己关于《STL源码剖析》的一些读书笔记,欢迎批评指正。