C++ list

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》侯捷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值