list
相较于vector的连续线性空间,list就显得复杂许多,它的好处就是每次插入或删除一个元素,就配置或释放一个元素空间。因此对于空间的运用有绝对的精准,一点也不浪费。而且对于任何位置的元素的插入或元素移除,list永远是常数时间。list和vector是两个最常被使用的容器。什么时机在最适合使用哪一种容器,必须视元素的多寡,元素的构造复杂度(有无 non-traivial copy constructor ,non-trivial copy assugnmen operator),元素的存取行为的特性而定。list不在能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在。所谓的list迭代器正确的递增,递减,取值,成员取用的操作是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取用的是节点的成员。
STL list 是一个双向链表(double linked-list),迭代器必须具备前移,后移的能力,所以list提供的是Bidirectional iterators.
list 有一个重要性质:插入操作(insert)和接合操作(splice)都不会造成原有的list迭代器失效。这在vector是不成立的,因为vector的插入操作造成记忆体(内存空间)重新配置,导致原有的跌大气全部失效。list的元素删除操作(erase),也只有指向被删除元素的那个迭代器失效,其他迭代器不受任何影响。
list::list()函数 功能:构造list
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::list()函数 功能:构造list
//constructors used in the same order as described above:
list<int>::iterator it;
list<int>first;//empty list of ints
list<int>second(5,20);//five ints with value 20;
list<int>third(second.begin(),second.end());
cout<<"the contents of third are:";
for(it=third.begin();it!=third.end();it++){
cout<<" "<<*it;
}
cout<<endl;
//iterating through second
list<int>fourth(third);
cout<<"the contents of fourth are:";
for(it=fourth.begin();it!=fourth.end();it++){
cout<<" "<<*it;
}
cout<<endl;
//a copy of third
//the iterator constructor can also be used to construct from arrays
int myints[]={1998,11,3,520};
list<int>fifth(myints,myints+sizeof(myints)/sizeof(int));
cout<<"the contents of fifth are:";
for(it=fifth.begin();it!=fifth.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::operator=()函数 功能:赋值list
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::operator=()函数 功能:赋值list
list<int>first(3);//list of 3 zero-initialized ints
list<int>second(11);//list of 11 zero-initialized ints
second=first;
first=list<int>();
cout<<"size of first :"<<int(first.size())<<endl;
cout<<"size of second :"<<int(second.size())<<endl;
}
list::assign()函数 功能:给list赋值
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::assign()函数 功能:给list赋值
list<int>first;
list<int>second;
first. assign(5,20);//5 ints with value 20
second.assign(first.begin(),first.end());//a copy of first
list<int>::iterator it;
cout<<"first contains:";
for(it=first.begin();it!=first.end();it++){
cout<<" "<<*it;
}
cout<<endl;
int myints[]={1998,11,3};
first.assign(myints,myints+3);//assigning from array
cout<<"size of first:"<<(int)first.size()<<endl;
cout<<"size of second:"<<(int)second.size()<<endl;
}
list::begin()函数 功能:返回指向第一个元素的迭代器
list::end()函数 功能:返回末尾的迭代器
list::rbegin()函数 功能:返回指向list尾部的逆向迭代器
list::rend()函数 功能:返回指向第一个元素的逆向迭代器
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::begin()函数 功能:返回指向第一个元素的迭代器
//list::end()函数 功能:返回末尾的迭代器
//list::rbegin()函数 功能:返回指向list尾部的逆向迭代器
//list::rend()函数 功能:返回指向第一个元素的逆向迭代器
int myints[]={1998,11,3,5,20};
list<int>mylist(myints,myints+5);
list<int>::iterator it;
cout<<"mylist contains:";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
list<int>::reverse_iterator rit;
cout<<"mylist contains:";
for(rit=mylist.rbegin();rit!=mylist.rend();rit++){
cout<<" "<<*rit;
}
cout<<endl;
}
list::back()函数 功能:返回最后一个元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::back()函数 功能:返回最后一个元素
list<int>mylist;
list<int>::iterator it;
mylist.push_back(11);
while(mylist.back()!=1){
mylist.push_back(mylist.back()-1);
}
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::front()函数 功能:返回第一个元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::front()函数 功能:返回第一个元素
list<int>mylist;
mylist.push_back(1998);
mylist.push_back(11);
mylist.push_back(3);
//now front equals 1998,and back 3
mylist.front()-=mylist.back();
cout<<"mylist.front()is now: "<<mylist.front()<<endl;
}
list::push_back()函数 功能:在list的末尾添加一个元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::push_back()函数 功能:在list的末尾添加一个元素
list<int>mylist;
int myint;
cout<<"please enter some integers(enter 0 to end):\n";
do{
cin>>myint;
mylist.push_back(myint);
} while(myint);
cout<<"mylist stores: "<<(int)mylist.size()<<endl;
}
list::pop_back()函数 功能: 删除最后一个元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::pop_back()函数 功能: 删除最后一个元素
list<int>mylist;
int sum(0);
mylist.push_back(1998);
mylist.push_back(11);
mylist.push_back(3);
while(!mylist.empty()){
sum+=mylist.back();
mylist.pop_back();
}
cout<<"the elements of mylist summed "<<sum<<endl;
}
list::push_front()函数 功能:在list的头部添加一个元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::push_front()函数 功能:在list的头部添加一个元素
list<int>mylist(5,20);//five ints with a value of 20
mylist.push_front(1998);
mylist.push_front(11);
mylist.push_front(3);
cout<<"mylist contains: ";
list<int>::iterator it;
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::pop_front()函数 功能:删除第一个元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::push_back()函数 功能:在list的末尾添加一个元素
//list::push_front()函数 功能:在list的头部添加一个元素
//list::pop_back()函数 功能: 删除最后一个元素
//list::pop_front()函数 功能:删除第一个元素
list<int>mylist(5,20);//five ints with a value of 20
list<int>::iterator it;
mylist.push_back(13);
mylist.push_back(14);
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.push_front(1998);
mylist.push_front(11);
mylist.push_front(3);
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.pop_back();
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.pop_front();
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::insert()函数 功能:插入一个元素到list中(插入下标的前面)
#include<iostream>
#include<list>
#include<vector>
using namespace std;
int main(){
//list::insert()函数 功能:插入一个元素到list中(插入下标的前面)
list<int>mylist;
list<int>::iterator it;
//set some initial values
for(int i=1;i<11;i++){
mylist.push_back(i);//1 2 3 4 5 6 7 8 9 10
}
cout<<"mylist contains:";
for(list<int>::iterator it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
it=mylist.begin();
++it;//it points now to number 2
mylist.insert(it,1314);//1 1314 2 3 4 5 6 7 8 9 10
cout<<"mylist contains:";
for(list<int>::iterator it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.insert(it,3,5);//1 1314 5 5 5 2 3 4 5 6 7 8 9 10
//注意 此时 it 还是指向2
cout<<"mylist contains:";
for(list<int>::iterator it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
vector<int>myvector(5,100);
mylist.insert(it,myvector.begin(),myvector.end());
cout<<"mylist contains:";
for(list<int>::iterator it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
//注意 此时 it 还是指向2
mylist.erase(it);//删掉了2
cout<<"mylist contains:";
for(list<int>::iterator it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
//如果此时还删掉it,则没有效果
++it; //删掉了3
mylist.erase(it);
cout<<"mylist contains:";
for(list<int>::iterator it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.erase(--it,++it);//注意此时it的位置不变--++,如果两次++++
cout<<"mylist contains:";
for(list<int>::iterator it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list:erase()函数 功能:删除一个元素或者一组连续元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list:erase()函数 功能:删除一个元素或者一组连续元素
list<int>mylist;
list<int>::iterator it,it1,it2;
//set some values:
for(int i=1;i<10;i++)mylist.push_back(i);
//1 2 3 4 5 6 7 8 9
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
it1=it2=mylist.begin();
advance(it2,6);
++it1;
it1=mylist.erase(it1);//1 3 4 5 6 7 8 9
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
it2=mylist.erase(it2);//1 3 4 5 6 8 9
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
++it1;
--it2;
mylist.erase(it1,it2);//1 3 6 8 9
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::clear()函数 功能:删除所有元素
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::clear()函数 功能:删除所有元素
list<int>mylist;
list<int>::iterator it;
mylist.push_back(1998);
mylist.push_back(11);
mylist.push_back(3);
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.clear();
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.push_back(1);
mylist.push_back(2);
mylist.push_back(3);
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::empty()函数 功能:如果list是空的则返回true
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::empty()函数 功能:如果list是空的则返回true
list<int>mylist;
int sum=0;
for(int i=1;i<11;i++){
mylist.push_back(i);
}
while(!mylist.empty()){
sum+=mylist.back();
mylist.pop_back();
}
cout<<"total: "<<sum<<endl;
}
list::size()函数 功能:返回list中元素的个数
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::size()函数 功能:返回list中元素的个数
list<int>myints;
cout<<"0.size"<<(int)myints.size()<<endl;
for(int i=0;i<10;i++){
myints.push_back(i);
}
cout<<"1.size"<<(int)myints.size()<<endl;
myints.insert(myints.begin(),11,3);
cout<<"2.size"<<(int)myints.size()<<endl;
myints.pop_back();
cout<<"3.size"<<(int)myints.size()<<endl;
}
list::resize()函数 功能:改变list的大小
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::resize()函数 功能:改变list的大小
list<int>mylist;
list<int>::iterator it;
//set some initial content
for(int i=1;i<11;i++) {
mylist.push_back(i);
}
mylist.resize(5);
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.resize(8,3);
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.resize(11);
cout<<"mylist contains: ";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::swap()函数 功能:交换两个list
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::swap()函数 功能:交换两个list
list<int>first(3,11);
//three ints with a value of 100
list<int>second(5,20);
//five ints with a value of 20
list<int>::iterator it;
cout<<"first contains: ";
for(it=first.begin();it!=first.end();it++){
cout<<" "<<*it;
}
cout<<endl;
cout<<"second contains: ";
for(it=second.begin();it!=second.end();it++){
cout<<" "<<*it;
}
cout<<endl;
first.swap(second);
cout<<"first contains: ";
for(it=first.begin();it!=first.end();it++){
cout<<" "<<*it;
}
cout<<endl;
cout<<"second contains: ";
for(it=second.begin();it!=second.end();it++){
cout<<" "<<*it;
}
cout<<endl;
}
list::get_allocator()函数 功能:返回list的适配器
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::get_allocator()函数 功能:返回list的适配器
list<int>mylist;
int *p;
//allocate an array of 5 elements using mylist's allocator
p=mylist.get_allocator().allocate(5);
//assign some values to array
for(int i=0;i<5;i++)p[i]=i;
cout<<"size of mylist"<<mylist.size()<<endl;//0
cout<<"the allocated array contains: ";
for(int i=0;i<5;i++){
cout<<" "<<p[i];
}
cout<<endl;
mylist.get_allocator().deallocate(p,5);
}
list::max_size()函数 功能:返回list能容纳的最大元素数量
#include<iostream>
#include<list>
using namespace std;
int main(){
//list::max_size()函数 功能:返回list能容纳的最大元素数量
list<int>mylist;
int i;
cout<<"enter number of elements:";
cin>>i;
if(i<mylist.max_size())mylist.resize(i);
else cout<<"that size exceeds the limit"<<endl;
list<int>::iterator it;
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
cout<<"size: "<<mylist.size()<<endl;
cout<<"max_size: "<<mylist.max_size()<<endl;
}
list::sort()函数 功能:给list排序
#include<iostream>
#include<list>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
bool compare_nocase(string first,string second){
unsigned int i=0;
while((i<first.length())&&(i<second.length())){
if(tolower(first[i])<tolower(second[i]))//转换为小写
return true;
++i;
}
if(first.length()<second.length())return true;
else return false;
}
//先按长度由小到大,在按开头字符a-z
int main(){
list<string>mylist;
list<string>::iterator it;
mylist.push_back("one");
mylist.push_back("two");
mylist.push_back("Three");
mylist.push_back("four");
mylist.sort();
cout<<"mylist contians:";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
mylist.sort(compare_nocase);
cout<<"mylist contians:";
for(it=mylist.begin();it!=mylist.end();it++){
cout<<" "<<*it;
}
cout<<endl;
string str = "THIS IS A STRING";
for (int i=0; i <str.size(); i++)
str[i] = tolower(str[i]);//把大写全部转为小写
cout<<str<<endl;
}
参考文献:《The Annotated STL Sources》侯捷