0%

STL

STL

The Standard Template Library (STL) is a set of C++ template classes to provide common programming data structures and functions such as lists, stacks, arrays, etc. It is a library of container classes, algorithms, and iterators. It is a generalized library and so, its components are parameterized. A working knowledge of template classes is a prerequisite for working with STL.

STL has four components

  • Algorithms
  • Containers
  • Functions
  • Iterators

标准模板库

标准模板库(standard template library,简写为STL)是用模板定义的一组类和函数。
STL定义了一组常用的数据结构,如向量,链表,集合,映射等,这些数据结构都被称为容器(container),为什么叫做容器呢?在我们的生活中,容器就是用来装一堆东西的。在这里,它们都用来管理一组元素,所以称之为容器。
STL定义了一组常用的算法,如排序,查找,集合计算(交集,并集)等。

容器

容器是什么?一个数组其实就是一个容器,管理某种类型的一个元素序列,每个元素都可按下标随机访问。数组作为容器的特点就是连续空间,固定大小,随机访问。缺点就是不容易在数组中间插入或者删除一个元素,因为会导致后面的元素逐个后移或前移。

STL容器是一组类模板,用来管理元素的序列。一个容器中的多个元素都具有相同类型,可以是基本类型,也可以是自定义类型。
容器可分为三大类:
序列容器(sequence container)、关联容器(associative container)和容器适配器(container adapter)
一、序列容器能维护插入元素的顺序,包括vector,deque,list等
二、关联容器按预定义顺序管理所插入元素,包括set,multiset,map,multimap
三、容器适配器是基于头等容器而建立的简单容器,包括stack,queue,priority_queue等。
序列容器与关联容器统称为头等容器(first-class container),意思是编程首选容器。

各类容器特点

容器名 中文名 头文件 特点 备注
vector <T> 向量 <vector> 适合在序列尾端加入或删除元素:适合随机访问元素 随机访问按下标,下标范围为[0,size()-1];不合适中间插入或删除
deque <T> 双端队列 <deque> 适合在序列两端加入或删除元素;适合随机访问元素 全称为double-ended queue 不合适中间插入或者删除
list<T> 链表 <list> 适合在序列中间插入或删除元素;适合双向遍历元素 双向链表实现,不适合随机访问
set<T> 集合 <set> 各元素不重复;适合双向遍历 元素按值升序排序;各元素值唯一,称为键key;不适合随机访问
multiset<T> 多集 <set> 可重复元素;可双向遍历元素 元素按值升序排序,各元素值不唯一,称为键key;不适合随机访问
map<T> 映射单射 <map> 元素是对偶pair<key,value>一对一,多对一;键不重复;适合双向遍历 各元素按键升序排序;各元素的键是一个集合
multimap 多射多值映射 <map> 元素是对偶pair<key,value>一对多,多对多;键可重复;适合双向遍历 各元素按键生按升序排序;各元素的键是一个多集
stack<T> <stack> 先进后出LIFO;不支持迭代器 用成员函数来操作元素,基于deque实现
queue<T> 队列 <queue> 先进先出FIFO;不支持迭代器 用成员函数来操作元素;基于deque 实现
priority_queue<T> 优先队列 <queue> 最高优先级先出;不支持迭代器 用成员函数来操作元素;基于vector实现;

STL还提供几种仿容器(near container):
一、数组array和可变长数组valarray:任何一个数组都可以看作是一个容器,下标看作迭代器。
二、String字符串类型
三、bitset位集

迭代器

迭代器是什么?以数组为例,访问一个数组元素要使用下标,如a[i],则下标就是数组元素的迭代器。下标本质上是一个指针,指向要访问的那个元素。迭代器是用来访问容器中的元素的一种数据结构,是指针的抽象,但更安全,功能更强。
不论是范性思维或者STL的实际运用,迭代器(iterators)都扮演者重要角色。STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起。

算法

STL算法包括<algorithm>与<numeric>

vector

vector的数据安排以及操作方式,与array非常相似。两者的唯一差别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变。要换个大或小一点的房子,可以一切琐细得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬到新址,再把原来的空间释放还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必担心空间不足而一开始就要求一个大块头的array了,我们可以安心使用vector,吃多少用多少。
注意:所谓扩充空间,不论多大,是配置新空间->数据移动->释放旧空间的过程,工程浩大。所谓动态增加大小,并不是在原空间之后连续新空间,因为无法保证原空间之后尚有可配置的空间,而是以原大小两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之一构造新元素,并释放原空间。因此对vector的任何操作,一旦引起空间空间重新配置,指向原vector的所有迭代器就都失效了。

vector::vector()函数 功能 构造函数

#include<iostream>
#include<vector>
using namespace std;
int main(){
    //vector::vector()函数 功能 构造函数
   //constructors used in the same order as described above:
   vector<int>first;//empty vector of ints
   vector<int>second(4,11);//four ints with value 100
   vector<int>third(second.begin(),second.end());
   //iterating through second
   vector<int>fourth(third);//copy of third
   //the iterator constructor can also be used to construct from arrays
   int myints[]={1998,11,3,5,2,0,13,14};
   vector<int>fifth(myints,myints+sizeof(myints)/sizeof(int));
   
   cout<<"The contents of first are:";
   for(int i=0;i<first.size();i++){
   	    cout<<" "<<first[i];
   }
   cout<<endl;
   cout<<"The contents of second are:";
   for(int i=0;i<second.size();i++){
   	     cout<<" "<<second[i];
   }
   cout<<endl;
  
   cout<<"The contents of third are:";
   for(int i=0;i<third.size();i++){
   	     cout<<" "<<third[i];
   }
   cout<<endl;
 
   cout<<"The contents of fourth are:";
   for(int i=0;i<fourth.size();i++){
   	     cout<<" "<<fourth[i];
   }
   cout<<endl;
   cout<<"The contents of fifth are:";  
   for(int i=0;i<fifth.size();i++){
    	cout<<" "<<fifth[i];
   }
   cout<<endl;
}

运行结果:

The contents of first are:
The contents of second are: 11 11 11 11
The contents of third are: 11 11 11 11
The contents of fourth are: 11 11 11 11
The contents of fifth are: 1998 11 3 5 2 0 13 14

vector::operator=()函数 功能:对vector进行赋值

#include<iostream>
#include<vector>
using namespace std;
int main(){
	 //vector::operator=()函数 功能:对vector进行赋值
	vector<int>first(3,1);
	vector<int>second(5,0);
	cout<<"first contains:";
	for(int i=0;i<first.size();i++){
		cout<<" "<<first[i];
	}
	cout<<endl;
	
    first=vector<int>(6,2);
    cout<<"first contains:";
	for(int i=0;i<first.size();i++){
		cout<<" "<<first[i];
	}
	cout<<endl;
	cout<<"Size of first:"<<int(first.size())<<endl;
	second=first;
	first=vector<int>();
	cout<<"Size of first:"<<int(first.size())<<endl;
	cout<<"Size of second:"<<int(second.size())<<endl;
}

运行结果:

first contains: 1 1 1
first contains: 2 2 2 2 2 2
Size of first:6
Size of first:0
Size of second:6

vector::operator 函数 功能:获取指定位置

#include<iostream>
#include<vector>
using namespace std;
int main(){
	 //vector::operator[]()函数 功能:获取指定位置
	vector<int>myvector(10);//10 zero-initialized elements
	unsigned int i;
	vector<int>::size_type sz=myvector.size();
	//assign some values:
	for(i=0;i<sz;i++)myvector[i]=i;
	cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
		cout<<" "<<myvector[i];
	}
	cout<<endl;
	for(int i=0;i<sz/2;i++){
		int temp;
		temp=myvector[sz-1-i];
		myvector[sz-1-i]=myvector[i];
		myvector[i]=temp;
	}
		cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
		cout<<" "<<myvector[i];
	}
	cout<<endl;
}

运行结果

myvector contains: 0 1 2 3 4 5 6 7 8 9
myvector contains: 9 8 7 6 5 4 3 2 1 0

vector::assign()函数 功能:对vector中的元素赋值

//vector::assign()函数
//功能:对vector容器中的元素赋值
//定义:template<class InputIterator>
//void assign(InpputIterator first ,InputIterator last);
//void assign(size_type n,const T&u);
//头文件<vector>
//vector assign
#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::assign()功能:对vector中的元素赋值 
	vector<int>first;
	vector<int>second;
	vector<int>third;
	first.assign(7,100);//a repetition 7 times of value 100
	vector<int>::iterator it;
	it=first.begin()+1;
	second.assign(it,first.end()-1);//the 5 central values of first
	int myints[]={1949,10,1};
	third.assign(myints,myints+3);//assigning from array
	cout<<"Size of first:"<<int(first.size())<<endl;
	cout<<"Size of second:"<<int(second.size())<<endl;
	cout<<"Size of thied:"<<int(third.size()) <<endl;
}

运行结果

Size of first:7
Size of second:5
Size of thied:3

vector::begin()函数 功能:返回第一个元素的迭代器

vector::end()函数 功能:返回最末元素的迭代器(注:实指向最末元素的下一个位置)

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::begin()函数 功能:返回第一个元素的迭代器
	//vector::end()函数 功能:返回最末元素的迭代器(注:实指向最末元素的下一个位置)
	vector<int>myvector;
	for(int i=1;i<=5;i++){
		myvector.push_back(i);
	}
	vector<int>::iterator it;
	cout<<"myvector contains:";
	for(it=myvector.begin();it<myvector.end();it++){
		cout<<" "<<*it; 
	}
	cout<<endl; 	 
}

运行结果

myvector contains: 1 2 3 4 5

vector::rbegin()函数 功能:返回vector尾部的逆迭代器

vector::rend()函数 功能:返回vector起始的逆迭代器

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::rbegin()函数 功能:返回vector尾部的逆迭代器
    //vector::rend()函数 功能:返回vector起始的逆迭代器 
	vector<int>myvector;
	for(int i=1;i<9;i++){
		myvector.push_back(i);
	}
	cout<<"myvector contains:";
	vector<int>::reverse_iterator rit;
	for(rit=myvector.rbegin();rit<myvector.rend();rit++){
		cout<<" "<<*rit;
	}
	cout<<endl;
	
	cout<<"myvector contains:";
	vector<int>::iterator it;
	for(it=myvector.begin();it<myvector.end();it++){
		cout<<" "<<*it;
	}
	cout<<endl;	 
}

运行结果

myvector contains: 8 7 6 5 4 3 2 1
myvector contains: 1 2 3 4 5 6 7 8

vector::back()函数 功能:返回末一个元素

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::back()函数 功能:返回最末一个元素 
	vector<int>myvector;
	myvector.push_back(10);
	while(myvector.back()!=0){
		myvector.push_back(myvector.back()-1); 
	}
	cout<<"myvector contains:";
	for(unsigned i=0;i<myvector.size();i++)
	  cout<<" "<<myvector[i];
	cout<<endl;
}

运行结果

myvector contains: 10 9 8 7 6 5 4 3 2 1 0

vector::front()函数 功能:返回第一个元素

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::front()函数 功能:返回第一个元素
	vector<int>myvector;
	myvector.push_back(11);
	myvector.push_back(3);
	//now front equals 11,and back 3
	myvector.front()-=myvector.back();
	cout<<"myvector.front() is now:"<<myvector.front()<<endl; 
}

运行结果

myvector.front() is now:8

vector::push_back()函数 功能:在vector最后添加一个元素

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::push_back()函数 功能:在vector最后添加一个元素
	vector<int>myvector;
	int myint;
	cout<<"please enter some integers(enter 0 to end):\n";
	do{
		cin>>myint;
		myvector.push_back(myint);
	}while(myint);
	cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
	cout<<" "<<myvector[i]; 
	}
	cout<<endl;
	cout<<"myvector stores "<<(int)myvector.size()<<" numbers\n";
}

运行结果

please enter some integers(enter 0 to end):
1
2
3
4
5
9
0
myvector contains: 1 2 3 4 5 9 0
myvector stores 7 numbers

vector::pop_back()函数 功能:移除最后一个元素

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::pop_back()函数 功能:移除最后一个元素
	vector<int>myvector;
	int sum(0);
	myvector.push_back(1);
	myvector.push_back(2);
	myvector.push_back(3);
	while(!myvector.empty()){
		sum+=myvector.back() ;
		myvector.pop_back(); 
	}
	cout<<"The elements of myvector summed: "<<sum<<endl;
}

运行结果

The elements of myvector summed: 6

vector:insert()函数 功能:插入元素到vector中

#include<iostream>
#include<vector>
using namespace std;
int main(){
    //vector:insert()函数 功能:插入元素到vector中
	vector<int>myvector(3,11);
	vector<int>::iterator it;
	it=myvector.begin();
	it=myvector.insert(it,1998);
	myvector.insert(it,2,16);
	//it no longer valid ,get a new one
	it=myvector.begin();
	vector<int>anothervector(3,15);
	myvector.insert(it+2,anothervector.begin(),anothervector.end());
	int myarray[]={1999,2,13};
	myvector.insert(myvector.begin(),myarray,myarray+3);
	cout<<"myvector contains:  ";
	for(it=myvector.begin();it!=myvector.end();it++){
		cout<<" "<<*it;
	}
	cout<<endl;
}

运行结果

myvector contains:   1999 2 13 16 16 15 15 15 1998 11 11 11

vector::erase()函数 功能:删除指定元素

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::erase()函数 功能:删除指定元素
	vector<int>myvector;
	//set some values(from1 to 10)
	for(int i=0;i<10;i++){
	myvector.push_back(i);}
	//erase the 6th element
	myvector.erase(myvector.begin()+5);
	cout<<"myvector contains:";
	vector<int>::iterator it;
	
	for(it=myvector.begin();it<myvector.end();it++){
		cout<<" "<<*it;
	}
	cout<<endl;
	myvector.erase(myvector.begin(),myvector.begin()+3);
	cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
		cout<<" "<<myvector[i];
	}
	cout<<endl;	 
}

运行结果

myvector contains: 0 1 2 3 4 6 7 8 9
myvector contains: 3 4 6 7 8 9

vector::clear()函数 功能:清空所有元素

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::clear()函数 功能:清空所有元素
    unsigned int i;
    vector<int>myvector;
    myvector.push_back(1);
    myvector.push_back(2);
    myvector.push_back(3);
    cout<<"myvector contains:";
    for(i=0;i<myvector.size();i++){
    	cout<<" "<<myvector[i];
	}
	cout<<endl;
	myvector.clear();
	myvector.push_back(2000);
	myvector.push_back(3000);
	vector<int>::iterator it;
	cout<<"myvector contains:";
	for(it=myvector.begin();it<myvector.end();it++){
		cout<<" "<<*it;
	}
}

运行结果

myvector contains: 1 2 3
myvector contains: 2000 3000

vector::empty()函数 功能判断vector是否为空,(返回true时为空)

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::empty()函数 功能判断vector是否为空,(返回true时为空)
	vector<int>myvector;
	int sum(0);
	for(int i=1;i<=10;i++){
		myvector.push_back(i);
	} 
	while(!myvector.empty()){
		sum+=myvector.back();
		myvector.pop_back();
	}
	cout<<"total:"<<sum<<endl;
}

运行结果

total:55

vector::size()函数 功能:返回vector元素数量大小

#include<iostream>
#include<vector>
using namespace std;
int main(){
	 //vector::size()函数 功能:返回vector元素数量大小
	vector<int>myints;
	cout<<"0.size: "<<int(myints.size())<<endl;
	for(int i=0;i<11;i++){
		myints.push_back(i);
	}
	cout<<"1.size: "<<int(myints.size())<<endl;
	
	myints.insert(myints.end(),11,3);
	cout<<"2.size: "<<int(myints.size())<<endl;
	for(int i=0;i<myints.size();i++){
		cout<<" "<<myints[i];
	}
	cout<<endl;
	myints.pop_back();
	cout<<"3.size: "<<int(myints.size())<<endl;
}

运行结果

0.size: 0
1.size: 11
2.size: 22
 0 1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 3 3 3
3.size: 21

vector::resize()函数 功能:改变vector元素数量的大小

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::resize()函数 功能:改变vector元素数量的大小
	vector<int>myvector;
	for(int i=0;i<10;i++){
		myvector.push_back(i);
	} 
	cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
		cout<<" "<<myvector[i];
	}
	cout<<endl;
	myvector.resize(5);
	cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
		cout<<" "<<myvector[i];
	}
	cout<<endl;
	myvector.resize(11,3);
	cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
		cout<<" "<<myvector[i];
	}
	cout<<endl;
	myvector.resize(16);
	cout<<"myvector contains:";
	for(int i=0;i<myvector.size();i++){
		cout<<" "<<myvector[i];
	}
	cout<<endl;
}

运行结果

myvector contains: 0 1 2 3 4 5 6 7 8 9
myvector contains: 0 1 2 3 4
myvector contains: 0 1 2 3 4 3 3 3 3 3 3
myvector contains: 0 1 2 3 4 3 3 3 3 3 3 0 0 0 0 0

vector::swap()函数 功能:交换两个vector

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::swap()函数 功能:交换两个vector
	vector<int>first(3,10);//three ints with a value of 10
	vector<int>second(5,20);//five ints with a value of 20
	cout<<"first contains:";
	for(int i=0;i<first.size();i++){
		cout<<" "<<first[i];
	}
	cout<<endl;
	cout<<"second contains:";
	for(int i=0;i<second.size();i++){
		cout<<" "<<second[i];
	}
	cout<<endl;
	 
    
	first.swap(second);
	cout<<"first contains:";
	for(int i=0;i<first.size();i++){
		cout<<" "<<first[i];
	}
	cout<<endl;
	cout<<"second contains:";
	for(int i=0;i<second.size();i++){
		cout<<" "<<second[i];
	}
	cout<<endl;
}

运行结果

first contains: 10 10 10
second contains: 20 20 20 20 20
first contains: 20 20 20 20 20
second contains: 10 10 10

vector::get_allocator()函数 功能:返回vector的内存分配器

#include<iostream>
#include<vector>
using namespace std;
int main(){
	//vector::get_allocator()函数 功能:返回vector的内存分配器
	vector<int>myvector0;
	int *p;
	//allocate an array of 10 elements using vector's allocator
	p=myvector0.get_allocator().allocate(5);
	
	//assign some values to array
	for(int i=0;i<5;i++){
		p[i]=i; 
	} 
	cout<<"The allocated array contains:";
	for(int i=0;i<5;i++){
		cout<<" "<<p[i];
	}
	cout<<endl;
    vector<int>myvector(3,1);
    vector<int>::iterator it;
    
    it=myvector.begin();
    it=myvector.insert(it,2);
    myvector.insert(it,3);
    //"it" no longer valid,get a new one;
    it=myvector.begin();
    vector<int>anthervector(2,4);
    
    myvector.insert(it+2,anthervector.begin(),anthervector.end());
    
    int myarray[]={5,2,0};
    
    myvector.insert(myvector.begin(),myarray,myarray+3);
    cout<<"myvector contains:";
    for(it=myvector.begin();it<myvector.end();it++){
    	cout<<" "<<*it;
	} 
}

运行结果

The allocated array contains: 0 1 2 3 4
myvector contains: 5 2 0 3 2 4 4 1 1 1

vector::at()函数 功能:返回指定位置的元素

#include<iostream>
#include<vector>
using namespace std;
int main(){
    //vector::at()函数 功能:返回指定位置的元素 
	vector<int>myvector(10);//10 zero-initialized ints
	unsigned int i;
	//assign some values;
	for(i=0;i<myvector.size();i++){
		myvector.at(i)=i;
	} 
	cout<<"myvector contains:";
	for(i=0;i<myvector.size();i++){
		cout<<" "<<myvector.at(i);
	}
	cout<<endl;
} 

运行结果

myvector contains: 0 1 2 3 4 5 6 7 8 9

vector::max_size()函数 功能:返回vector所能容纳元素的最大数量上

vector::capacity()函数 功能:返回vector所能容纳的元素数量,在不重新分配内存的情况下

#include<iostream>
#include<vector>
using namespace std;
    
int main(){
	//vector::max_size()函数 功能:返回vector所能容纳元素的最大数量上限
	//vector::capacity()函数 功能:返回vector所能容纳的元素数量,在不重新分配内存的情况下 
	vector<int>myvector;
	//set some content in the vector:
	for(int i=1;i<98;i++){
		myvector.push_back(i);
	}
	cout<<"size: "<<(int)myvector.size()<<endl;
	cout<<"capacity: "<<(int)myvector.capacity()<<endl;
	cout<<"max_size: "<<(int)myvector.max_size()<<endl;
}

运行结果

size: 97
capacity: 128
max_size: -1

priority_queue

顾名思义,priority_queque是一个拥有权值观念的queque,它允许加入新元素,移除旧元素,审视新元素值等功能。由于这是一个queque,所以只允许在底端键入元素,并从顶端取出元素,除此之外别无其他存取元素途径。priority_queque带有权值观念,其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前。缺省情况下priority_queque系利用一个max_heap完成,后者是一个vector表现得complete binary tree.max_heap 可以满足priority_queque所需要的“依照权值高低自动递减排序”的特性。由于priority_queque完全以底部容器为根据,再加上heap处理规则,所以实现非常简单。缺省情况下是以vector为底部容器。由于priority_queque系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,成为(配接器,适配器)adapter,因此SLT priority_queque 往往不被归类为container(容器),而被归类为container adapter。priority_queque的所有元素,进出都有一定规则,只有queqeu顶端的元素(权值最高者),才有机会被外界取用。priority_queque不提供遍历功能,也不提供迭代器。

priority_queue::empty()函数 功能:如果优先队列为空,则返回真

priority_queue::pop()函数 功能:删除第一个元素

priority_queue::push()函数 功能:加入一个元素

priority_queue::size()函数 功能:返回优先队列中拥有的元素的个数

priority_queue::top()函数 功能:返回优先队列中有最高优先级的元素

#include<iostream>
#include<queue>
using namespace std;

int main(){
    //priority_queue::empty()函数 功能:如果优先队列为空,则返回真
    //priority_queue::pop()函数 功能:删除第一个元素
	//priority_queue::push()函数 功能:加入一个元素 
	//priority_queue::size()函数 功能:返回优先队列中拥有的元素的个数
	//priority_queue::top()函数 功能:返回优先队列中有最高优先级的元素
	 
    priority_queue<int>mypq;
    int sum(0);
    for(int i=0;i<=11;i++){
    	mypq.push(i);
	}
	cout<<mypq.top()<<endl; 
	while(!mypq.empty()){
		sum+=mypq.top();
		mypq.pop();
	}
	cout<<"total:"<<sum<<endl;
	
    priority_queue<int>mypq1;
	
	mypq1.push(1999);
	mypq1.push(2000);
	mypq1.push(1998);
	mypq1.push(2020);
	cout<<"size of mypq1 :"<<mypq1.size()<<endl;
	cout<<"popping out elements:";
	while(!mypq1.empty()){
		cout<<" "<<mypq1.top();
		mypq1.pop();
	}
	cout<<endl;
	cout<<"size of mypq1 :"<<mypq1.size()<<endl;
	 
	  
	
} 

运行结果

size of mypq :4
popping out elements: 2020 2000 1999 1998
size of mypq :0

pari的比较,先比较第一个元素,第一个相等比较第二

#include<iostream>
#include<queue> 
#include<utility>//pair
using namespace std;

int main(){
   
   int profits[] = {1,2,3};
   int capitals[] = {0,1,1};
   priority_queue<pair<int, int>,vector<pair<int, int>>, greater<pair<int, int>>> capitalProfits;
    
   for (int i = 0; i < 3; i++) 
        capitalProfits.emplace(make_pair(capitals[i], profits[i]));
    
   while (!capitalProfits.empty()) 
    {
        cout << capitalProfits.top().first << ' ' << capitalProfits.top().second << '\n';
        capitalProfits.pop();
    }

} 

运行结果

0 1
1 2
1 3
#include<iostream>
#include<queue> 
#include<utility>//pair
using namespace std;

int main(){
   
   int profits[] = {1,2,3};
   int capitals[]  = {0,1,1};
//   priority_queue<pair<int, int>,vector<pair<int, int>>, greater<pair<int, int>>> capitalProfits;
   priority_queue<pair<int,int>> capitalProfits; 
   for (int i = 0; i < 3; i++) 
        capitalProfits.emplace(make_pair(capitals[i], profits[i]));
    
   while (!capitalProfits.empty()) 
    {
        cout << capitalProfits.top().first << ' ' << capitalProfits.top().second << '\n';
        capitalProfits.pop();
    }

} 

运行结果

1 3
1 2
0 1

String

string::string() 功能:构造函数,用于字符串初始化

#include<iostream>
#include<string>

using namespace std;

int main(){
   //string::string() 功能:构造函数,用于字符串初始化 
   string s1;
   string s2("mozhenhai string");
   string s3(s2);
   string s4(s2,8);
   string s5(10,'m');
   string s6a(10,42);
   string s6b(s2.c_str(),s2.c_str()+4);
   cout<<s1<<endl;
   cout<<s2<<endl;
   cout<<s3<<endl;
   cout<<s4<<endl;
   cout<<s5<<endl;
   cout<<s6a<<endl;
   cout<<s6b<<endl;
} 

运行结果


mozhenhai string
mozhenhai string
i string
mmmmmmmmmm
**********
mozh

string::operator+=()函数 功能:连接两个字符串

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::operator+=()函数 功能:连接两个字符串
	string first("tomy");
	string second("may");
	first+=" is a boy ";
	second+=" is a girl";
	cout<<first<<endl;
	cout<<first<<endl;
	first+=second;
	cout<<first<<endl;

} 

运行结果

tomy is a boy
tomy is a boy
tomy is a boy may is a girl

string::operator=()函数 功能:字符串赋值

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::operator=()函数 功能:字符串赋值
	string str1="Test string " ;
	string str2("code");
	string str3("mo");
	
	str1+=str2;
	cout<<str1<<endl;
	str1+=str3;
	cout<<str1<<endl;
    //string::operator[]()函数 功能:获取特定的字符
	string str("test string");
	for(int i=0;i<str.size();i++){
		cout<<str[i]<<" ";
	}

} 

运行结果

Test string code
Test string codemo
t e s t   s t r i n g

string::operator[] () 功能:获取特定的字符

#include<iostream>
#include<string>

using namespace std;

int main(){
   //string::operator[]() 功能:获取特定的字符
   string str("mozhenhai");
   for(int i=0;i<str.length();i++){
   	cout<<str[i]<<" ";
   } 
   
} 

运行结果

m o z h e n h a i

string::assign()函数 功能:为字符串赋新值

#include<iostream>
#include<string>

using namespace std;

int main(){
	//string::assign()函数 功能:为字符串赋新值
	string str;
	string base="mozhenhai is wrinting#code";
	//used in the smae order as described above
	str.assign(base);
	    cout<<str<<endl;
	str.assign(base,9,12);
    	cout<<str<<endl;	
	str.assign("program is the tool",7);
		cout<<str<<endl;
	str.assign("I like coding");
		cout<<str<<endl;
	str.assign(3,'?');
		cout<<str<<endl;
	str.assign<int>(3,0x2F);
		cout<<str<<endl; 
	str.assign(base.begin()+2,base.end()-4);
	    cout<<str<<endl;
} 

运行结果

mozhenhai is wrinting#code
 is wrinting
program
I like coding
???
///
zhenhai is wrinting#

string::append()函数 功能:在字符串的末尾添加文本

#include<iostream>
#include<string>

using namespace std;

int main(){
	//string::append()函数 功能:在字符串的末尾添加文本 
	string str;
	string str2="mozhenhai";
	string str3="you#are#a#bad#boy";
	//used in the same order as described above
	str.append(str2);
	cout<<str<<endl;
	str.append(str3,3,6);//第四个个字符后面六个字符包括第四个 
	cout<<str<<endl;
	str.append("boy",2);
	cout<<str<<endl;
	str.append("good:");
	cout<<str<<endl;
	str.append(6,'!');
	cout<<str<<endl;
	str.append(str3.begin()+4,str3.end());
	cout<<str<<endl;
	str.append<int>(6,0x2E);//"......"
	cout<<str<<endl;
} 

运行结果

mozhenhai
mozhenhai#are#a
mozhenhai#are#abo
mozhenhai#are#abogood:
mozhenhai#are#abogood:!!!!!!
mozhenhai#are#abogood:!!!!!!are#a#bad#boy
mozhenhai#are#abogood:!!!!!!are#a#bad#boy......

string::begin()函数 功能:返回一个迭代器;指向第一个字符

string::end()函数 功能:返回一个迭代器;指向字符串的末尾。(最后一个字符的下一个位置)

#include<iostream>
#include<string>

using namespace std;

int main(){
	 //string::begin()函数 功能:返回一个迭代器;指向第一个字符
    //string::end()函数  功能:返回一个迭代器;指向字符串的末尾。(最后一个字符的下一个位置)
	 
	string str("program");
	string::iterator it;
	for(it=str.begin();it<str.end();it++){
		cout<<" "<<*it;
		
	} 
} 

运行结果

p r o g r a m

string::rbegin()函数 功能:返回一个逆向迭代器,指向最后一个字符

string::rend()函数 功能:返回一个逆向迭代器,指向第一个元素的前一个位置

#include<iostream>
#include<string>
#include<fstream>

using namespace std;

int main(){
   //string::rbegin()函数 功能:返回一个逆向迭代器,指向最后一个字符
   //string::rend()函数 功能:返回一个逆向迭代器,指向第一个元素的前一个位置
   string str("mozhenhai is coding");
   string::reverse_iterator rit;
   for(rit=str.rbegin();rit!=str.rend();rit++){
   	cout<<*rit;
   } 
   cout<<endl;
   
} 

运行结果

gnidoc si iahnehzom

string::push_back() 功能:Append character to string待完善

#include<iostream>
#include<string>
#include<fstream>

using namespace std;

int main(){
   //string::push_back() 功能:Append character to string
   string str;
   ifstream file("test.txt",ios::in);
   while(!file.eof()){
   	str.push_back(file.get());
   }
   cout<<str;

   
} 

test.txt 的内容

You are coder.The code is art.
Coding is cool.

运行结果

You are coder.The code is art.
Coding is cool.

string::insert()函数 功能:插入字符

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::insert()函数 功能:插入字符
	string str1="you are a lovely boy";
	string str2="not ";
	string str3("is intelligent girl");
	
	string::iterator it;
	
//	used in the same order as described above
    str1.insert(8,str2);
    cout<<str1<<endl;
    str1.insert(14,str3,3,11);
    cout<<str1<<endl;
    str1.insert(14,"code is intersting ",5);
    cout<<str1<<endl;
    str1.insert(14,"code is intersting ");
    cout<<str1<<endl;
    str1.insert(14,2,',');
    cout<<str1<<endl;
    str1.insert(str1.begin()+3,'#');
    cout<<str1<<endl;
	str1.insert(str1.end(),4,'!');
	cout<<str1<<endl;
	it=str1.insert(str1.begin()+3,'$');
	cout<<str1<<endl;
	str1.insert(it+2,str3.begin(),str3.begin()+2);
	cout<<str1<<endl;

} 

运行结果

you are not a lovely boy
you are not a intelligentlovely boy
you are not a code intelligentlovely boy
you are not a code is intersting code intelligentlovely boy
you are not a ,,code is intersting code intelligentlovely boy
you# are not a ,,code is intersting code intelligentlovely boy
you# are not a ,,code is intersting code intelligentlovely boy!!!!
you$# are not a ,,code is intersting code intelligentlovely boy!!!!
you$#is are not a ,,code is intersting code intelligentlovely boy!!!!

string::erase()函数 功能:删除字符

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::erase()函数 功能:删除字符
	string str("you are a lovely boy");
	string::iterator it;
	//erase used in the same order as described above:
	str.erase(14);//删除下标为14(第十五个字符)及以后的字符 
	cout<<str<<endl;
	str.erase(5,2);//删除下标为5及后面一个字符。就是连同下标为5的两个字符 
	cout<<str<<endl;

} 

运行结果

you are a love
you a a love

string::clear()函数 功能:Clear string

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::clear()函数 功能:Clear string
    string str("tomy");
    cout<<str<<endl;
	str.clear();
	cout<<"after str.clear:"<<str<<endl;
	char c;
	cout<<"please type some lines of text.Enter a period to finsh:\n"<<endl;
	do{
		c=cin.get();
		str+=c;
		if(c=='\n'){
			cout<<str<<endl;
			str.clear();
			
		}
	}while(c!='.');
	cout<<"after str.clear:"<<str;//str 为 . 
} 

运行结果

tomy
after str.clear:
please type some lines of text.Enter a period to finsh:

hello world.
after str.clear:hello world.

string::empty()函数 功能:如果字符串为空,返回真

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::empty()函数 功能:如果字符串为空,返回真
	string str1;
	string str2;
	cout<<"please introduce a text,Enter an empty line to finsh:\n"<<endl;
	do{
		getline(cin,str2);
		str1+=str2+'\n';
		 
	}while(!str2.empty());
	cout<<"The text you intorduced was:\n";
	cout<<str1;

} 

运行结果

please introduce a text,Enter an empty line to finsh:

hello world

The text you intorduced was:
hello world

string::c_str()函数 功能:将字符串以C字符数组的形式返回

#include<iostream>
#include<string>
#include<cstring>
#include<fstream>

using namespace std;

int main(){
   //string::c_str()函数 功能:将字符串以C字符数组的形式返回
   char *cstr,*p;
   string str("mo zhen hai is coding program is intersting");
   cstr=new char [str.size()+1];
   strcpy(cstr,str.c_str());
   //cstr now contains a c-string copy of str
   p=strtok(cstr," ");
   while(p!=NULL){
   	cout<<p<<endl;
   	p=strtok(NULL," ");
   }
    delete[] cstr;
} 

运行结果

mo
zhen
hai
is
coding
program
is
intersting
/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

运行结果

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

string::copy()函数 功能:将内容复制为一个字符数组

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::copy()函数 功能:将内容复制为一个字符数组
	
	string str("program codecode");
	int length;
	char buffer[20];
	length=str.copy(buffer,6,5);//6,5:5为字符的下标,6为字符串长度 
	buffer[length]='\0';
	
	cout<<"buffer contains: "<<buffer<<endl;
	
	char *array=new char [20];
	array[str.copy(array,4,6)];
	cout<<array<<endl;
	array[str.copy(array,5)];
	cout<<array<<endl;
	delete []array; 

} 

运行结果

buffer contains: am cod
m co
progr

string::length()函数 功能:返回字符串的长度

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::length()函数 功能:返回字符串的长度
	string str("I like program");
	cout<<"The length of str is :"<<str.length()<<"characters"<<endl;

} 

运行结果

The length of str is :14characters

string::size()函数 功能:返回字符串中字符的数量

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::size()函数 功能:返回字符串中字符的数量
	//string::length()函数 功能:返回字符串的长度
	string str("program code");
	cout<<"The size of str is : "<<str.size()<<endl;
	cout<<"The length of str is : "<<str.length()<<endl;
    //string::substr()函数 功能:返回某个子字符串
	string str1("you are program boy");
	string str2=str1.substr(3,4);//3,4 3是下标位置 ,4是长度 
	cout<<str2<<endl; 
} 

运行结果

The size of str is : 12
The length of str is : 12
 are

string::capacity()函数 功能:返回重新分配空间前的字符容量

#include<iostream>
#include<string>

using namespace std;

int main(){
	//string::capacity()函数 功能:返回重新分配空间前的字符容量
	string str("program is");
	cout<<"size "<<str.size()<<endl;
	cout<<"length: "<<str.length()<<endl;
	cout<<"capacity "<<str.capacity()<<endl;
	cout<<"max_size "<<str.max_size()<<endl;
} 

运行结果

size 10
length: 10
capacity 10
max_size 4611686018427387897
string::max_size()函数 功能:返回字符的最大可能个数
#include<iostream>
#include<string>
#include<cstring>
#include<fstream>

using namespace std;

int main(){
   //string::max_size()函数 功能:返回字符的最大可能个数
   string str("mozhenhai");
   cout<<"size: "<<str.size()<<endl;
   cout<<"length: "<<str.length()<<endl;
   cout<<"capacity: "<<str.capacity()<<endl;
   cout<<"max_size: "<<str.max_size()<<endl; 
  
}
   

运行结果

size: 9
length: 9
capacity: 9
max_size: 4611686018427387897

string::swap()函数 功能:交换两个字符串的内容

#include<iostream>
#include<string>

using namespace std;

int main(){
   //string::swap()函数 功能:交换两个字符串的内容
	string buyer("money");
	string seller("goods");
	
	cout<<"before swap buyer:"<<buyer<<endl;
	cout<<"before swap seller:"<<seller<<endl;
	
	seller.swap(buyer);
	 
    cout<<"after swap buyer:"<<buyer<<endl;
	cout<<"after swap seller:"<<seller<<endl;
} 

运行结果

before swap buyer:money
before swap seller:goods
after swap buyer:goods
after swap seller:money

string::find()函数 功能:在字符串中查找字符

#include<iostream>
#include<string>

using namespace std;

int main(){
   //string::find()函数 功能:在字符串中查找字符
    string str("The boy is writing code");
    string strf1("by");
    string strf2("is");
    cout<<string::npos<<endl; 
    cout<<str.find(strf1)<<endl; //返回子字符串在字符串中的起始位置下标 
    size_t found;
    found-str.find(strf2);
    if(found!=string::npos){
    	cout<<strf2<<" at: "<<found<<endl;
	}
} 

运行结果

18446744073709551615
18446744073709551615
is at: 24

string::substr()函数 功能:返回某个子字符串

#include<iostream>
#include<string>
#include<cstring>
#include<fstream>

using namespace std;

int main(){
   //string::substr()函数 功能:返回某个子字符串
   string str="i am coding,what are you doing";
   string str1,str2;
   size_t pos;
   str1=str.substr(5,6);//"coding"
   pos=str.find("you");//get from "you" to the end
   str2=str.substr(pos);
   cout<<str1<<endl;
   cout<<str2<<endl; 
} 

运行结果

coding
you doing

string::at()函数 功能:按给定索引值返回字符

#include<iostream>
#include<string>

using namespace std;

int main(){
		//string::at()函数 功能:按给定索引值返回字符
	string str("mozhenhai");
	for(int i=0;i<str.length();i++){
		cout<<str.at(i)<<endl;
	}
} 

运行结果

m
o
z
h
e
n
h
a
i
#include<iostream>
#include<string>
#include<cstring>
#include<fstream>

using namespace std;

int main(){
   //string::data()函数 功能:返回内容的字符数组形式
   int length;
   string str="mozhenhai";
   char *cstr="mozhenhai";
   if(str.length()==strlen(cstr)){
   	cout<<"str and cstr hava the same length"<<endl;
   	length=str.length();
   	//C 库函数 int memcmp(const void *str1, const void *str2, size_t n))
	// 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
	/*参数
    str1 -- 指向内存块的指针。
    str2 -- 指向内存块的指针。
    n -- 要被比较的字节数。
    返回值
    如果返回值 < 0,则表示 str1 小于 str2。
    如果返回值 > 0,则表示 str1 大于 str2。
    如果返回值 = 0,则表示 str1 等于 str2。*/
    /*s1,s2为字符串时候memcmp(s1,s2,1)就是比较s1和s2的第一个字节的ascII码值;
    memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值;

    如:char *s1="abc";
       char *s2="acd";
       int r=memcmp(s1,s2,3);
   就是比较s1和s2的前3个字节,
   第一个字节相等,第二个字节比较中大小已经确定,
   不必继续比较第三字节了所以r=-1.*/
   	if(memcmp(cstr,str.data(),length)==0){
   		cout<<"str and cstr have the same content"<<endl;
	   }
   }
}
   

运行结果

str and cstr hava the same length
str and cstr have the same content

string::compare()函数 功能:比较两个字符串,相等返回0,不相等返回-1

#include<iostream>
#include<string>

using namespace std;

int main(){
    //string::compare()函数 功能:比较两个字符串,相等返回0,不相等返回-1 
	
	string str1("code");
	string str2("programcode");
	string str3("code");
	cout<<str1.compare(str3)<<endl;
	if(str1.compare(str2)){
		cout<<"str1:"<<str1<<endl<<"str2:"<<str2; 
	}
	cout<<str2.compare(7,10,"code")<<endl;
	//7,10表示第八个字符到第十一个字符 
	cout<<str2.size()<<endl;
	
	cout<<str2.compare(str2.size()-4,4,"code")<<endl;
	cout<<str2.compare(7,4,"code")<<endl;
	
	//7,4表示第八个字符后面四个字符包括第八个
	//简单概括就是如果后面数字前面大按照下标截取
	//如果后面数字比前面小或等按照下标加长度
	cout<<str1.compare(2,2,str2,9,10)<<endl;//str1:de str2:de
	cout<<str1.compare(2,2,str2,9,12)<<endl;//str1:de str2:de
	//第二种截取字符串的方法
	//表明超出字符串长度的下标和字符串最大下标效果一样 
} 

运行结果

0
str1:code
str2:programcode0
11
0
0
0
0

stack

stack是一种先进后出(First In Last Out,FILO)的数据结构。它只有一个出口,stack允许新增元素,移除元素,取得最顶端元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素,换而言之,stack不允许有遍历行为。
将元素推入stack的操作称为push,将元素推出stack的操作称为pop.
以某种既有容器作为底部结构,将其接口改变,使之符合“先进后出”的特性,形成一个stack,是很容易做到的。deque是双向开口的数据结构,若以deque为底部结构并封闭其头端开口,便轻而易举地形成了一个stack.以deque作为缺省情况下的stack底部结构,stack的实现很简单。
由于stack系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,成为(配接器,适配器)adapter,因此SLT stack 往往不被归类为container(容器),而被归类为container adapter。
stack所有元素的进出都必须符合“先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。stack不提供走访功能,也不提供迭代器。
除了deque之外,list也是双向开口的数据结构。因为若以list底部结构并封闭其头端开口,一样能够轻易形成一个stack。

stack::empty()函数 功能:栈为空则返回真

stack::pop()函数 功能:移除栈顶元素

stack::push()函数 功能:在栈顶添加元素

stack::size()函数 功能:返回栈中元素数目

stack::top()函数 功能:返回栈顶元素

#include<iostream>
#include<stack>
using namespace std;

int main(){
     //stack::empty()函数 功能:栈为空则返回真
     //stack::pop()函数 功能:移除栈顶元素
	 //stack::push()函数 功能:在栈顶添加元素
	 //stack::size()函数 功能:返回栈中元素数目 
	 //stack::top()函数 功能:返回栈顶元素 
	 stack<int>mystack;
	 int sum(0);
	 for(int i=0;i<11;i++){
	 	mystack.push(i);
	 }
	 cout<<"mystack size:"<<mystack.size()<<endl;
	 cout<<"mystack.top() is now :"<<mystack.top()<<endl;
	 while(!mystack.empty()){
	 	sum+=mystack.top();
	 	mystack.pop();
	 }
	 cout<<"total:"<<sum<<endl; 
     // stack::stack()函数 功能: 构造stack
}     

运行结果

mystack size:11
mystack.top() is now :10
total:55

queue

queue::queue()函数 创建queue

queue::size()函数 功能:返回队列中元素的个数

queue::push()函数 功能:在队列末尾加入一个元素

queue::pop()函数 功能:删除队列第一个元素

queue::front()函数 功能:返回第一个元素

queue::back()函数 功能:返回最后一个元素

queue::empty()函数 功能:如果队列为空则返回真

#include<iostream>
#include<queue>
#include<list>
#include<deque> 
using namespace std;

int main(){
	//queue::queue()函数 创建queue
	deque<int>mydeck(3,1999);//deque with 3 elements
	list<int>mylist(2,1998);//list with 2 elements
	queue<int>first;//empty queue
	queue<int>second(mydeck);//queue initialized to copy of deque
	queue<int,list<int>>third;
	//empty queue with lish as underlying container
	
	queue<int,list<int>>fourth(mylist);
	
	cout<<"size of first:"<<(int)first.size()<<endl;
	cout<<"size of second:"<<(int)second.size()<<endl;
	cout<<"size of third:"<<(int)third.size()<<endl;
	cout<<"size of fourth:"<<(int)fourth.size()<<endl;
} 

运行结果

size of first:0
size of second:3
size of third:0
size of fourth:2
#include<iostream>
#include<queue>
#include<list>
#include<deque> 
using namespace std;

int main(){
    //queue::size()函数 功能:返回队列中元素的个数
	//queue::push()函数 功能:在队列末尾加入一个元素
	//queue::pop()函数 功能:删除队列第一个元素
	//queue::front()函数 功能:返回第一个元素 
	//queue::back()函数 功能:返回最后一个元素
	//queue::empty()函数 功能:如果队列为空则返回真
	 
	queue<int>myints;
	cout<<"0.size:"<<(int)myints.size()<<endl;
	for(int i=0;i<10;i++)
	{
		myints.push(i); 
	}
	cout<<"1.size:"<<(int)myints.size()<<endl;
	cout<<myints.front()<<endl;
	myints.pop();
	
	cout<<myints.front()<<endl;
	cout<<myints.back()<<endl; 
	int sum(0);
	while(!myints.empty()){
		sum+=myints.front();
		myints.pop();
	} 
	cout<<sum<<endl;
	}

运行结果

0.size:0
1.size:10
0
1
9
45

deuque

deque是连续空间(至少逻辑上看来如此),连续线性空间总是令我们联想到array或vector。array无法成长,vector虽然可以成长,却只能向尾端成长,而且其所谓的成长是个假象,事实上是:一另觅更大空间,二将原有数据复制过去,三释放原空间三部曲。如果不是vector每次配置新空间是都有留下一个余裕,其成长假象所带来的带起将是相当高昂。deque系由一段一段的定量连续空间构成。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量连续空间,串接在deqeu的头部或尾部。便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口。避开了“重新配置,复制,释放”的轮回,代价则是复杂的迭代器架构。受到分段连续线性空间的字面影响,我们可能以为deque的实现复杂程度和vector相比较虽不中亦不远矣,其实不然。主要因为,既曰分段连续线性空间,就必须有中央控制,而为了维持整体连续的假象,数据结构的设计及迭代器前进后退等操作都颇为繁琐。deque的实现代码分量远比vector或list都多得多。deque采用一块所谓的map(注意:不是STL的map容器),作为主控,这里所谓map是一小块连续空间,其中每个元素(此处成为一个节点,node)都是指针,指向另一段(较大的)连续线性空间,成为缓冲区。缓冲区才是deque的存储空间主体。

deque::deque()函数 功能:创建一个新双向队列

#include<iostream>
#include<deque>
using namespace std;
int main(){
	//deque::deque()函数 功能:创建一个新双向队列
	deque<int>first;//empty deque if ints
	deque<int>second(5,20);//five ints with values 20
	deque<int>third(second.begin(),second.end());//iterating through second
	deque<int>fourth(third);//a copy of third
	//the iterator constructor can also be used to construct from arrays
	int myints[]={1998,11,3,520,13,14};
	
	deque<int>fifth(myints,myints+sizeof(myints)/sizeof(int));
	cout<<"the contents of first are:";
	for(int i=0;i<first.size();i++){
		cout<<" "<<first[i];
	}
	cout<<endl;
	cout<<"the contents of second are:";
	for(int i=0;i<second.size();i++){
		cout<<" "<<second[i];
	}
	cout<<endl;
	cout<<"the contents of third are:";
	for(int i=0;i<third.size();i++){
		cout<<" "<<third[i];
	}
	cout<<endl;
	cout<<"the contents of fourth are:";
	for(int i=0;i<fourth.size();i++){
		cout<<" "<<fourth[i];
	}

	cout<<endl;
	cout<<"the contents of fifth are:";
	for(int i=0;i<fifth.size();i++){
		cout<<" "<<fifth[i];
	}
	cout<<endl;   
}

运行结果

the contents of first are:
the contents of second are: 20 20 20 20 20
the contents of third are: 20 20 20 20 20
the contents of fourth are: 20 20 20 20 20
the contents of fifth are: 1998 11 3 520 13 14

deque::operator=()函数 功能赋值双向队列

#include<iostream>
#include<deque>
using namespace std;
int main(){
	///deque::operator=()函数 功能赋值双向队列 
	deque<int>first(3);//deque with 3 zero-initialized ints
	deque<int>second(5);//deque with 5 zero-initialized ints
	second=first;
	first=deque<int>(6);
	cout<<"size of fist "<<int(first.size())<<endl;
	cout<<"size of second "<<int(second.size())<<endl;
}

运行结果

size of fist 6
size of second 3

deque::operator函数 功能:Access element

#include<iostream>
#include<deque>
using namespace std;
int main(){
	// deque::operator[]()函数 功能:Access element
    deque<int>mydeque(10);//10 zero-initialized elements
	deque<int>::size_type sz=mydeque.size();
	for(int i=0;i<sz;i++)mydeque[i]=2*i;
	//reverse order of elements using operator[]:
	for(int i=0;i<sz/2;i++){
		int temp;
		temp=mydeque[sz-1-i];
		mydeque[sz-1-i]=mydeque[i];
		mydeque[i]=temp;
	}
	cout<<"mydeque contains:"<<endl;
	for(int i=0;i<sz;i++){
		cout<<" "<<mydeque[i];
	}
	cout<<endl;
}

运行结果

mydeque contains:
 18 16 14 12 10 8 6 4 2 0

deque::assign函数 功能:设置双向队列的值

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::assign函数 功能:设置双向队列的值
	deque<int>first;
	deque<int>second;
	deque<int>third;
	first.assign(6,11);//a repetition 6 times of value 11
	deque<int>::iterator it;
	it=first.begin()+1;
	second.assign(it,first.end());//the 5 values of first
	int myints[]={1998,11,3};
	third.assign(myints,myints+3);//assigning from array
	cout<<"size of first: "<<int(first.size())<<endl;
	cout<<"size of second: "<<int(second.size())<<endl;
	cout<<"size of third: "<<int(third.size())<<endl;
}

运行结果

size of first: 6
size of second: 5
size of third: 3

deque::begin()函数 功能:返回指向第一个元素的迭代器

deque::end()函数 功能:返回指向尾部的迭代器

deque::rbegin()函数 功能:返回指向尾部的逆向迭代器

deque::rend()函数 功能:返回指向头部的逆向迭代器

#include<iostream>
#include<deque>
using namespace std;
int main(){
     //deque::begin()函数 功能:返回指向第一个元素的迭代器
	 //deque::end()函数 功能:返回指向尾部的迭代器
	 //deque::rbegin()函数 功能:返回指向尾部的逆向迭代器
	 //deque::rend()函数 功能:返回指向头部的逆向迭代器
	  
	deque<int>mydeque;
	deque<int>::iterator it;
	deque<int>::reverse_iterator rit;
	for(int i=0;i<9;i++){
	 	mydeque.push_back(i);
	 }
	cout<<"mydeque contains:";
	 
	for(it=mydeque.begin();it!=mydeque.end();it++){
	 	cout<<" "<<*it;
	 } 
	cout<<endl;
    it=mydeque.begin();
    cout<<"begin to end";
    while(it!=mydeque.end()){
    	cout<<" "<<*it++;
	}
	
	rit=mydeque.rbegin();
	cout<<endl;
	cout<<"mydeque contains:";
	cout<<"rbegin to rend";
	while(rit!=mydeque.rend()){
		cout<<" "<<*rit++; 
	}
}

运行结果

mydeque contains: 0 1 2 3 4 5 6 7 8
begin to end 0 1 2 3 4 5 6 7 8
mydeque contains:rbegin to rend 8 7 6 5 4 3 2 1 0

deque::back()函数 功能:返回最后一个元素

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::back()函数 功能:返回最后一个元素
	deque<int>mydeque;
	mydeque.push_back(10);
	while(mydeque.back()!=0){
	mydeque.push_back(mydeque.back()-1);
	}
	cout<<"mydeque contains: ";
	for(int i=0;i<mydeque.size();i++){
	cout<<" "<<mydeque[i]; 
	}
	cout<<endl;
}

运行结果

mydeque contains:  10 9 8 7 6 5 4 3 2 1 0

deque::front()函数 功能:返回第一个元素

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::front()函数 功能:返回第一个元素 
	deque<int>mydeque;
	mydeque.push_back(11);
	mydeque.push_back(3);
	mydeque.push_front(1998);
	mydeque.front()+=mydeque.back();
	cout<<"mydeque contains:";
	for(int i=0;i<mydeque.size();i++){
		cout<<" "<<mydeque[i];
	} 
}

运行结果

mydeque contains: 2001 11 3

deque::push_back()函数 功能:在尾部加入一个元素

deque::pop_back()函数 功能: 删除尾部的元素

deque::push_front()函数 功能:在头部加入一个元素

deque::pop_front()函数 功能:删除头部的元素

#include<iostream>
#include<deque>
using namespace std;
int main(){
	//deque::pop_back()函数 功能: 删除尾部的元素
    //deque::push_back()函数 功能:在尾部加入一个元素
    
    //deque::pop_front()函数 功能:删除头部的元素 
	//deque::push_front()函数 功能:在头部加入一个元素
	
    //deque::back()函数 功能:返回最后一个元素
	//deque::front()函数 功能:返回第一个元素
	deque<int>mydeque;
	int sumback(0);
	int sumfront(0);
	mydeque.push_back(1998);
	mydeque.push_back(11);
	mydeque.push_back(3);
	while(!mydeque.empty()){
		sumback+=mydeque.back();
		mydeque.pop_back();
	}
	mydeque.push_front(1998);
	mydeque.push_front(11);
	mydeque.push_front(3);
	while(!mydeque.empty()){
		sumfront+=mydeque.front();
		mydeque.pop_front();
	}
	cout<<"the elements of mydeque summed "<<sumback<<" or "<<sumfront<<endl; 
}

运行结果

the elements of mydeque summed 2012 or 2012

deque::insert()函数 功能:插入 一个元素到双向队列中

#include<iostream>
#include<deque>
#include<vector>
using namespace std;
int main(){
    //deque::insert()函数 功能:插入 一个元素到双向队列中
	deque<int>mydeque;
	deque<int>::iterator it;
	//set some initial values
	for(int i=1;i<6;i++){
		mydeque.push_back(i);//1 2 3 4 5
	} 
	it=mydeque.begin();
	it=mydeque.insert(it,1998);
	//it now points to the newly inserted 10
	mydeque.insert(it,3,11);
	//it no longer valid!!!!
	it=mydeque.end()-3;
	vector<int>myvector(2,23);
	mydeque.insert(it,myvector.begin(),myvector.end());
	cout<<"mydeque contains: ";
	for(it=mydeque.begin();it!=mydeque.end();it++){
		cout<<" "<<*it; 
	}
}

运行结果

mydeque contains:  11 11 11 1998 1 2 23 23 3 4 5

deque::erase()函数 功能:删除一个元素

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::erase()函数 功能:删除一个元素
	deque<int>mydeque;
	//set some values (from 1 to 10)
	for(int i=1;i<11;i++){
		mydeque.push_back(i);
	}
	//erase the 6th element
	mydeque.erase(mydeque.begin()+5);
	cout<<"mydeque contains: ";
	for(int i=0;i<mydeque.size();i++){
		cout<<" "<<mydeque[i]; 
	}
	cout<<endl;
	//erase the first 3 elements
	mydeque.erase(mydeque.begin(),mydeque.begin()+3);
	cout<<"mydeque contains: ";
	for(int i=0;i<mydeque.size();i++){
		cout<<" "<<mydeque[i]; 
	}
	cout<<endl;
}

运行结果

mydeque contains:  1 2 3 4 5 7 8 9 10
mydeque contains:  4 5 7 8 9 10

deque::clear()函数 功能:删除所有元素

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::clear()函数 功能:删除所有元素 
    deque<int>mydeque;
    mydeque.push_back(1998);
    mydeque.push_back(11);
    mydeque.push_back(3);
    cout<<"mydeque contains: ";
    for(int i=0;i<mydeque.size();i++){
    	cout<<" "<<mydeque[i]; 
	}
	cout<<endl;
	mydeque.clear();
	
	cout<<"size of mydeque: "<<mydeque.size()<<endl;
	
	mydeque.push_back(2000);
	mydeque.push_back(2);
	cout<<"mydeque contains: ";
    for(int i=0;i<mydeque.size();i++){
    	cout<<" "<<mydeque[i]; 
	}
	cout<<endl;
}

运行结果

mydeque contains:  1998 11 3
size of mydeque: 0
mydeque contains:  2000 2

deque::empty()函数 功能:返回真如果双向队列为空

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::empty()函数 功能:返回真如果双向队列为空
	deque<int>mydeque;
	int sum(0);
	for(int i=0;i<=10;i++){
		mydeque.push_back(i);
	}
	while(!mydeque.empty()){
		sum+=mydeque.back();
		mydeque.pop_back();
	}
	cout<<"total:"<<sum;
}

运行结果

total:55

deque::size()函数 功能:返回双向队列中元素的个数

deque::resize()函数 功能:改变双向队列的大小

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::resize()函数 功能:改变双向队列的大小
    //deque::size()函数 功能:返回双向队列中元素的个数 
	deque<int>mydeque;
	deque<int>::iterator it;
	//set some initial content
	for(int i=1;i<11;i++){
		mydeque.push_back(i);
	}
	mydeque.resize(5);
	cout<<"mydeque contains:";
	for(it=mydeque.begin();it!=mydeque.end();it++){
		cout<<" "<<*it;
	} 
	cout<<" size of mydeque: "<<mydeque.size();
	cout<<endl;
	mydeque.resize(8,23);
	cout<<"mydeque contains:";
	for(it=mydeque.begin();it!=mydeque.end();it++){
		cout<<" "<<*it;
	} 
	cout<<" size of mydeque: "<<mydeque.size();
	cout<<endl;
	mydeque.resize(11);
	cout<<"mydeque contains:";
	for(it=mydeque.begin();it!=mydeque.end();it++){
		cout<<" "<<*it;
	} 
	cout<<" size of mydeque: "<<mydeque.size(); 
	cout<<endl;
}

运行结果

mydeque contains: 1 2 3 4 5 size of mydeque: 5
mydeque contains: 1 2 3 4 5 23 23 23 size of mydeque: 8
mydeque contains: 1 2 3 4 5 23 23 23 0 0 0 size of mydeque: 11

deque::swap()函数 功能:和另一个双向队列交换元素

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::swap()函数 功能:和另一个双向队列交换元素
	deque<int>first(3,1998);//three ints with a value of 1998
	deque<int>second(5,20);//five ints with value of 20
	cout<<"before first contains: ";
	for(int i=0;i<first.size();i++){
		cout<<" "<<first[i];
	}
	cout<<endl;
	cout<<"before second contains: ";
	for(int i=0;i<second.size();i++){
		cout<<" "<<second[i];
	}
	cout<<endl;
	first.swap(second);
	cout<<"after first contains: ";
	for(int i=0;i<first.size();i++){
		cout<<" "<<first[i];
	}
	cout<<endl;
	cout<<"after second contains: ";
	for(int i=0;i<second.size();i++){
		cout<<" "<<second[i];
	}
	cout<<endl;
	 
}

运行结果

before first contains:  1998 1998 1998
before second contains:  20 20 20 20 20
after first contains:  20 20 20 20 20
after second contains:  1998 1998 1998

deque::get_allocator()函数 功能:返回双向队列的配置器

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::get_allocator()函数 功能:返回双向队列的配置器
	deque<int>mydeque;
	int *p;
	unsigned int i;
	//allocate an array of 5 elements using deque's allocator
	p=mydeque.get_allocator().allocate(5);
	//assign some values to array
	for(i=0;i<5;i++){
		p[i]=i;
	}
	cout<<"the allocated array contains:";
	for(i=0;i<5;i++){
		cout<<" "<<p[i]; 
	}
    cout<<endl;
    mydeque.get_allocator().deallocate(p,5);
}

运行结果

the allocated array contains: 0 1 2 3 4

deque()::at()函数 功能:返回指定元素

#include<iostream>
#include<deque>
using namespace std;
int main(){
     //deque()::at()函数 功能:返回指定元素
	deque<int>mydeque(10);
	//10 zero-initialized ints
	//assign some values
	for(int i=0;i<mydeque.size();i++){
		mydeque.at(i)=i;}
		
		cout<<"mydeque contains: ";
		for(int i=0;i<mydeque.size();i++){
			cout<<" "<<mydeque.at(i);
		} 
		cout<<endl;	 
}

运行结果

mydeque contains:  0 1 2 3 4 5 6 7 8 9

deque::max_size()函数 功能:返回双向队列能容纳的最大元素个数

#include<iostream>
#include<deque>
using namespace std;
int main(){
    //deque::max_size()函数 功能:返回双向队列能容纳的最大元素个数
	deque<int>mydeque;
	int i;
	cout<<"enter number of elements:";
	cin>>i;
	if(i<mydeque.max_size())mydeque.resize(i);
	else cout<<"that size exceeds the limit \n"; 
}

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;	
 
}

set

标准的STL关联式容器分为set(集合)和map(映射表)两大类。以及这两大类的衍生体multiset(多建集合)和multimap(多键映射表)。这些容器的底层机制均是以RB-tree(红黑树)完成的。RB-tree也是一个独立容器,但并不对外开放使用。

set 的特性是,所有元素都会根据元素的键值自动被排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值,set不允许两个元素有相同的键值。
我们可以通过set的迭代器改变set的元素值吗?不行,因为set的元素值就是其键值,关系到set元素的排列规则。如果任意改变set的元素值,会严重破坏set组织。set<T>::iterator 被定义为底层RB-tree的const_iterator,杜绝写入操作,换句话说,set iterators 是一种constant iterator(相对于 mutable iterator)。
set拥有和list相同的某些性质,当客户端对它进行元素新增操作(insert)或删除操作(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。当然,被删除的那个元素的迭代器必然是个例外。
由于RB-tree是一种平衡二叉搜索树,自动排序的效果很是不错,所以标准的STL set 即以RB-tree为底层机制。又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的set的操作行为,都只是转调用RB-tree的操作行为而已。
multiset 的特性以及用法与set完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()。

set::set()函数 功能:构造set

#include<iostream>
#include<set>
using namespace std;

bool fncomp(int lhs,int rhs){
	     return lhs<rhs;
	}
	struct classcomp{
		bool operator()(const int& lhs,const int& rhs){
			return lhs<rhs;
		}
	}; 
	
int main(){
    //set::set()函数 功能:构造set
    set<int>first;//empty set of ints
    int myints[]{1,2,3,4,5};
    set<int>second(myints,myints+5);
    //pointers used as iterator
    set<int>third(second);//a copy of second
    set<int>fourth(second.begin(),second.end());
    //iterator ctor
	set<int,classcomp>fifth;
	//class as compare
	bool(*fn_pt)(int,int)=fncomp;
	set<int,bool(*)(int,int)>sixth(fn_pt);//function pointer as compare
	return 0;		 
}

set::operator=()函数 功能:赋值set

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::operator=()函数 功能:赋值set
	//set::size()函数 功能:集合中元素的数目
	//set::begin()函数  功能:返回指向第一个元素的迭代器
	//set::end()函数 功能:返回指向最后一个元素的迭代器 
	int myints[]={1998,11,1,2,3};
	set<int>first(myints,myints+5);//set with 5 ints
	set<int>second;//empty set
	second=first;//now second contains the 5 ints
	first=set<int>();//and first is empty
	set<int>myset;
	myset=second;
	
	cout<<"Size of first:"<<int(first.size())<<endl; 
	cout<<"Size of second:"<<int(second.size())<<endl; 
	set<int>::iterator it;
	cout<<"myset contains";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it;
	}
}

运行结果

Size of first:0
Size of second:5
myset contains 1 2 3 11 1998

set::begin()函数 功能:返回指向第一个元素的迭代器

set::end()函数 功能:返回指向最后一个元素的迭代器

set::rbegin()函数 功能:返回指向集合中最后一个元素的反向迭代器

set::rend()函数 功能:返回指向集合中第一个元素的反向迭代器

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::rbegin()函数 功能:返回指向集合中最后一个元素的反向迭代器 
    //set::rend()函数  功能:返回指向集合中第一个元素的反向迭代器
	int myints[]={1998,11,1};
	set<int>myset(myints,myints+3);
	set<int>::iterator it;
	cout<<"myset contains:";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it;
	} 
	cout<<endl;
	set<int>::reverse_iterator rit;
	cout<<"myset contains:";
	for(rit=myset.rbegin();rit!=myset.rend();rit++){
		cout<<" "<<*rit;
	} 
	cout<<endl;
}

运行结果

myset contains: 1 11 1998
myset contains: 1998 11 1

set::insert()函数 功能: 在集合中插入元素

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::insert()函数 功能: 在集合中插入元素
	set<int>myset;
	set<int>::iterator it;
	pair<set<int>::iterator,bool>ret;
	//set some initial values
	for(int i=1;i<6;i++){
		myset.insert(i*10);
	//set:10  20 30 40 50 	
	} 
	ret=myset.insert(20);//no new elements inserted
	if(ret.second==false)it=ret.first;//it now points to elements 20
	myset.insert(it,25);//max efficiency inserting
	myset.insert(it,24);//max efficiency inserting
	myset.insert(it,26);//no max efficiency inserting
	
	int myints[]={1949,10,1};
	//10 already in set,not inserted
	myset.insert(myints,myints+3);
	cout<<"myset contains:";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it; 
	}
	cout<<endl;

}

运行结果

myset contains: 1 10 20 24 25 26 30 40 50 1949

set::erase()函数 功能:删除集合中的元素

set::find()函数 功能:返回一个指向被查找元素的迭代器

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::erase()函数 功能:删除集合中的元素
    //set::find()函数 功能:返回一个指向被查找元素的迭代器 
	set<int>myset;
	set<int>::iterator it;
	//insert some values
	for(int i=1;i<11;i++){
		myset.insert(i*10);
	}
	it=myset.begin();
	it++;//it points now to 2o
	myset.erase(it);
	myset.erase(40);//找得到就删除,如果没有就删除,比如41 
	it=myset.find(60);
	
	myset.erase(it,myset.end());
	cout<<"myset contains:";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it;
	}
	cout<<endl;
}

运行结果

myset contains: 10 30 50

set::clear()函数 功能:清除所有元素

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::clear()函数 功能:清除所有元素 
    set<int>myset;
	set<int>::iterator it;
	myset.insert(1998);
	myset.insert(11);
	myset.insert(3);
	cout<<"myset contains:";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it;	
	}
	cout<<endl;
	myset.clear();
	cout<<"myset contains:";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it;	
	}
	cout<<endl;
	myset.insert(1999);
	myset.insert(2000);
		cout<<"myset contains:";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it;	
	}
	cout<<endl;
}

运行结果

myset contains: 3 11 1998
myset contains:
myset contains: 1999 2000

set::empty()函数 功能:如果集合为空,返回true

#include<iostream>
#include<set>
using namespace std;
    
int main(){
    //set::empty()函数 功能:如果集合为空,返回true
	set<int>myset;
	myset.insert(1998); 
	myset.insert(11); 
	myset.insert(3);
	myset.insert(1999);
	cout<<"myset contains: ";
	while(!myset.empty()){
		cout<<" "<<*myset.begin();
		myset.erase(myset.begin());
	}
	cout<<endl;
	  
	 
}

运行结果

myset contains:  3 11 1998 1999

set::count()函数 功能:返回某个值元素的个数

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::count()函数 功能:返回某个值元素的个数
	set<int>myset;
	//set some intial values
	for(int i=1;i<5;i++){
		myset.insert(i*3);//set:3 6 9 12
	} 
	for(int i=0;i<10;i++){
		cout<<i;
		if(myset.count(i)>0)
		 cout<<" is an elements of myset"<<endl;
		else
		 cout<<" is not an elements of myset"<<endl;
		 	
	}
	myset.insert(9);
	myset.insert(9);
	myset.insert(9);
    cout<<myset.count(9)<<endl;//只输出一个	
}

运行结果

0 is not an elements of myset
1 is not an elements of myset
2 is not an elements of myset
3 is an elements of myset
4 is not an elements of myset
5 is not an elements of myset
6 is an elements of myset
7 is not an elements of myset
8 is not an elements of myset
9 is an elements of myset
1

set::size()函数 功能:集合中元素的数目

#include<iostream>
#include<set>
using namespace std;
    
int main(){
    //set::size()函数 功能:集合中元素的数目 
	set<int>myset;
	myset.insert(1998); 
	myset.insert(11); 
	myset.insert(3);
	cout<<"myset contains: ";
	while(!myset.empty()){
		cout<<" "<<*myset.begin();
		myset.erase(myset.begin());
	}
	cout<<endl;
	cout<<"size "<<(int)myset.size()<<endl;
	for(int i=1;i<11;i++)myset.insert(i);
	cout<<"size "<<(int)myset.size()<<endl;
	myset.insert(1998);
	myset.insert(98);//插入自动排序 
	cout<<"size "<<(int)myset.size()<<endl;
	myset.erase(6);
	cout<<"size "<<(int)myset.size()<<endl;
	cout<<"myset contains: ";
	set<int>::iterator it;
	for(it=myset.begin();it!=myset.end();it++){
	cout<<" "<<*it; 
	} 
	cout<<endl;
}

运行结果

myset contains:  3 11 1998
size 0
size 10
size 12
size 11
myset contains:  1 2 3 4 5 7 8 9 10 98 1998

set::swap()函数 功能:交换两个集合变量

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::swap()函数 功能:交换两个集合变量
    int myints[]={1,2,3,4,5,6,7,8,9};
	set<int>first(myints,myints+3);
	set<int>second(myints+3,myints+6);
	set<int>::iterator it;
	
	cout<<"before swap first contains:";
	for(it=first.begin();it!=first.end();it++){
		cout<<" "<<*it;
	}
	cout<<endl;
	cout<<"before swap 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;
}

运行结果

before swap first contains: 1 2 3
before swap second contains: 4 5 6
first contains: 4 5 6
second contains: 1 2 3

set::get_allocator()函数 功能:返回集合分配器

#include<iostream>
#include<set>
using namespace std;
 
int main(){
     //set::get_allocator()函数 功能:返回集合分配器
    set<int>myset;
	int *p;
	unsigned int i;
	//allocate an array of 5 elements ysing myset's allocator
	p=myset.get_allocator().allocate(6);
	//assign some values to array
	for(int i=0;i<6;i++){
		p[i]=(i+1)*10;
	}
	cout<<"The allocated array contains:";
	for(int i=0;i<6;i++){
		cout<<" "<<p[i];
	}
	cout<<endl;
	myset.get_allocator().deallocate(p,6);

}

运行结果

The allocated array contains: 10 20 30 40 50 60

set::key_comp()函数 功能:返回一个用于元素间比较的函数

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::key_comp()函数 功能:返回一个用于元素间比较的函数 
    set<int>myset;
	set<int>::key_compare mycomp;
	set<int>::iterator it;
	int highest;
	mycomp=myset.key_comp();
	for(int i=0;i<=5;i++){
		myset.insert(i);
	}
	cout<<"myset contains:";
	highest=*myset.rbegin();
	//set::rbegin()返回指向集合中最后一个元素的反向迭代器 
	 
	it=myset.begin();
	do{
		cout<<" "<<*it;
	}while(mycomp(*it++,highest));
	cout<<endl;
}

运行结果

myset contains: 0 1 2 3 4 5

set::value_comp()函数 功能:返回一个用于比较元素间的值的函数

#include<iostream>
#include<set>
using namespace std;
    
int main(){
    //set::value_comp()函数 功能:返回一个用于
	set<int>myset;
	set<int>::value_compare mycomp;
	set<int>::iterator it;
	int highest;
	mycomp=myset.value_comp();
	for(int i=0;i<=5;i++){
		myset.insert(i);
	}
	cout<<"myset contains:";
	highest=*myset.rbegin();
	//set::rbegin()返回指向集合中最后一个元素的反向迭代器 
	 
	it=myset.begin();
	do{
		cout<<" "<<*it;
	}while(mycomp(*it++,highest));
	cout<<endl; 
}

运行结果

myset contains: 0 1 2 3 4 5

set::lower_bound()函数 返回指向大于等于某值的第一个元素的迭代器

set::upper_bound()函数 返回指向大于等于某值的迭代器

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::lower_bound()函数 返回指向大于等于某值的第一个元素的迭代器
    //set::upper_bound()函数 返回指向大于等于某值的迭代器 
	set<int>myset;
	set<int>::iterator it ,itlow,itup;
	for(int i=1;i<10;i++){
		myset.insert(i*10);//10 20 30 40 50 60 70 80 90
	} 
    itlow=myset.lower_bound(30);
    itup=myset.upper_bound(60);
	cout<<"itlow:"<<*itlow<<endl;
	cout<<"itup:"<<*itup<<endl; 
	myset.erase(itlow,itup);//不删除itup指向的元素 
	//10 20 70 80 90
	cout<<"myset contains:";
	for(it=myset.begin();it!=myset.end();it++){
		cout<<" "<<*it;
	}
	cout<<endl;
}

运行结果

itlow:30
itup:70
myset contains: 10 20 70 80 90

set::max_size()函数 返回集合能容纳的元素的最大限值

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::max_size()函数 返回集合能容纳的元素的最大限值
	set<int>myset;
	if(myset.max_size()>1000){
		for(int i=0;i<1000;i++){
			myset.insert(i);
		}
		cout<<"the set contains 1000 elements"<<endl;
	}
	else{
		cout<<"the set could not contains 1000 elements"<<endl;	
	} 
	cout<<myset.max_size();
}

运行结果

the set contains 1000 elements
461168601842738790

set::equal_range()函数 功能:返回集合中与给定值相等的上下限的两个迭代器

#include<iostream>
#include<set>
using namespace std;
 
int main(){
    //set::equal_range()函数 功能:返回集合中与给定值相等的上下限的两个迭代器
	set<int>myset;
	pair<set<int>::iterator,set<int>::iterator>ret;
	for(int i=1;i<6;i++){
		myset.insert(i*10);//set:10 20 30 40 50
	} 
	ret=myset.equal_range(30);
	cout<<"lower bound points to:"<<*ret.first<<endl;
	cout<<"upper bound points to:"<<*ret.second<<endl;
}

运行结果

lower bound points to:30
upper bound points to:40

multiset::count()函数 与set::count()有区别

#include<iostream>
#include<set>
using namespace std;

int main(){
     //multiset::count()函数 与set::count()有区别
	int myints[]={1,2,3,3,3,3,3,4,5,6};
	multiset<int>mymultiset(myints,myints+sizeof(myints));
	cout<<"3 appears ";
	cout<<(int)mymultiset.count(3);
	cout<<" times in mymultiset"<<endl;
	//与set的区别,其他函数大都相同 
} 

运行结果

3 appears 5 times in mymultiset

map

标准的STL关联式容器分为set(集合)和map(映射表)两大类。以及这两大类的衍生体multiset(多建集合)和multimap(多键映射表)。这些容器的底层机制均是以RB-tree(红黑树)完成的。RB-tree也是一个独立容器,但并不对外开放使用。
map的特性是,所有元素都会根据元素的键值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一元素被视为键值。第二元素被视为实值。map不允许两个元素拥有相同的键值。
我们可以通过map的迭代器改变map的元素内容吗?如果想要修正元素的键值,答案是不行,因为map元素的键值关系到map元素的排序规则。任意改变map元素键值,将会严重破坏map组织。但是如果想要修正元素的实值,答案是可以的,因为map元素的实值并不影响map的元素的排列规则。因此,map iterators 既不是一种constant iterator,也不是一种mutable iterators

map拥有和list相同的某些性质,当客户端对它进行元素新增操作(insert)或删除操作(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。当然,被删除的那个元素的迭代器必然是个例外。
由于RB-tree是一种平衡二叉搜索树,自动排序的效果很是不错,所以标准的STL map 即以RB-tree为底层机制。又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map的操作行为,都只是转调用RB-tree的操作行为而已。
multimap 的特性以及用法与map完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制RB-tree的insert_equal()而非insert_unique()。

map::map()函数 功能:构造map

map::operator=()函数 功能:赋值map

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::operator=()函数 赋值map 
	map<char,int>first;
	map<char,int>second;
	first['x']=8;
	first['y']=18;
	first['z']=28;
	second=first;//second now contains 3 ints
	first=map<char,int>();//and first is now empty
	cout<<"size of first: "<<int(first.size())<<endl;
	cout<<"size of second: "<<int(second.size())<<endl;
}

运行结果

size of first: 0
size of second: 3

map::begin()函数 功能:返回指向map头部的迭代器

map::end()函数 功能:返回指向map末尾的迭代器

map::rbegin()函数 功能:返回一个指向map尾部的逆向迭代器

map::rend()函数 功能:返回一个指向map头部的逆向迭代

#include<iostream>
#include<map>
using namespace std;
 
int main(){
	//map::begin()函数 功能:返回指向map头部的迭代器
	//map::end()函数 功能:返回指向map末尾的迭代器
	//map::rbegin()函数 功能:返回一个指向map尾部的逆向迭代器
	//map::rend()函数 功能:返回一个指向map头部的逆向迭代器
	map<char,int>mymap;
	map<char,int>::iterator it;
	mymap['a']=100;
	mymap['b']=200;
	mymap['c']=300;
	//show content;
	for(it=mymap.begin();it!=mymap.end();it++){
		cout<<(*it).first<<":"<<(*it).second<<endl;
	}
	map<char,int>::reverse_iterator rit;
	for(rit=mymap.rbegin();rit!=mymap.rend();rit++){
		cout<<(*rit).first<<": "<<(*rit).second<<endl;
		
	} 
}

运行结果

a:100
b:200
c:300
c: 300
b: 200
a: 100

map::insert()函数 功能:插入元素

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::insert()函数 功能:插入元素
	map<char,int>mymap;
	map<char,int>::iterator it;
	pair<map<char,int>::iterator,bool>ret;
	//first insert function vertion(single parameter):
    mymap.insert(pair<char,int>('a',10));
	mymap.insert(pair<char,int>('z',20));
	ret=mymap.insert(pair<char,int>('z',60));
	if(ret.second==false){
		cout<<"element  'z' already existed"<<endl;
		cout<<"with a value of "<<ret.first->second<<endl;
	}
	//second insert function version(with hint position):
	it=mymap.begin();
	mymap.insert(it,pair<char,int>('b',11));//max efficiency inserting
	mymap.insert(it,pair<char,int>('c',12));//no max efficiency inserting
	//third insert function version(range insertion)
	map<char,int>anothermap;
	anothermap.insert(mymap.begin(),mymap.find('c'));
	//show contents:
	cout<<"mymap contains:"<<endl;
	for(it=mymap.begin();it!=mymap.end();it++){
		cout<<(*it).first<<":"<<(*it).second<<endl;
	}
	cout<<"anothermap contains:"<<endl;
	for(it=anothermap.begin();it!=anothermap.end();it++){
		cout<<(*it).first<<":"<<(*it).second<<endl;
	}
}

运行结果

element  'z' already existed
with a value of 20
mymap contains:
a:10
b:11
c:12
z:20
anothermap contains:
a:10
b:11

map::erase()函数 功能:删除一个元素

#include<iostream>
#include<map>
using namespace std;
 
int main(){
	//map::erase()函数 功能:删除一个元素
	map<char,int>mymap;
	map<char,int>::iterator it;
	// insert some values
	mymap['a']=1;
	mymap['b']=2;
	mymap['c']=3;
	mymap['d']=4;
	mymap['e']=5;
	mymap['f']=6;
	mymap['g']=7;
	it=mymap.find('b');
	mymap.erase(it);//erasing by iterator
	mymap.erase('c');//erasing by key
	it=mymap.find('e');
	mymap.erase(it,mymap.end());//erasing by range
	//show content
	for(it=mymap.begin();it!=mymap.end();it++){
		cout<<(*it).first<<":"<<(*it).second<<endl;
	}
}

运行结果

a:1
d:4

map::find()函数 功能:查找一个元素,如果找到返回改元素的迭代器

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::find()函数 功能:查找一个元素,如果找到返回改元素的迭代器
    map<char,int>mymap;
	map<char,int>::iterator it;
	// insert some values
	mymap['a']=1;
	mymap['b']=2;
	mymap['c']=3;
	mymap['d']=4;
	mymap['e']=5;
	mymap['f']=6;
	mymap['g']=7;
	it=mymap.find('b');
	mymap.erase(it);
	mymap.erase(mymap.find('d'));
	while(!mymap.empty()){
//		cout<<(*mymap.begin()).first<<":"<<(*mymap.begin()).second<<endl;
		cout<<mymap.begin()->first<<":"<<mymap.begin()->second<<endl;
		mymap.erase(mymap.begin());
	}
}

运行结果

a:1
c:3
e:5
f:6
g:7

map::clear() 函数 功能:删除所有元素

#include<iostream>
#include<map>
using namespace std;
int main(){
    //map::clear() 函数 功能:删除所有元素
	map<char,int>mymap;
	map<char,int>::iterator it;
	mymap['m']=1998;
	mymap['z']=11;
	mymap['h']=3;
	cout<<"mymap contains:\n";
	for(it=mymap.begin();it!=mymap.end();it++){
		cout<<(*it).first<<"->"<<(*it).second<<endl;
	}
	mymap.clear();
	mymap['a']=1999;
	mymap['b']=9;
	mymap['c']=15;
	cout<<"mymap contains:\n";
	for(it=mymap.begin();it!=mymap.end();it++){
		cout<<(*it).first<<"->"<<(*it).second<<endl;
	}
	 
}

运行结果

mymap contains:
h->3
m->1998
z->11
mymap contains:
a->1999
b->9
c->15

map::empty()函数 功能:如果map为空则返回true

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::empty()函数 功能:如果map为空则返回true
	map<char,int>mymap;
	map<char,int>::iterator it;
	// insert some values
	mymap['a']=1;
	mymap['b']=2;
	mymap['c']=3;
	mymap['d']=4;
	mymap['e']=5;
	mymap['f']=6;
	mymap['g']=7;
	while(!mymap.empty()){
		cout<<(*mymap.begin()).first<<":"<<(*mymap.begin()).second<<endl;
		cout<<mymap.begin()->first<<":"<<mymap.begin()->second<<endl;
		mymap.erase(mymap.begin());
	}
}

运行结果

a:1
a:1
b:2
b:2
c:3
c:3
d:4
d:4
e:5
e:5
f:6
f:6
g:7
g:7

map::count()函数 功能:返回指定元素出现的次数

#include<iostream>
#include<map>
using namespace std;
 
int main(){
	 //map::count()函数 功能:返回指定元素出现的次数
	map<char,int>mymap;
	char c;
	mymap['a']=1;
	mymap['b']=2;
	mymap['c']=3;
	for(c='a';c<'h';c++){
		cout<<c;
		if(mymap.count(c)>0)
		  cout<<"  is an elements of mymap"<<endl;
		else
		  cout<<"  is not an elements of mymap"<<endl;
	} 
}

运行结果

a  is an elements of mymap
b  is an elements of mymap
c  is an elements of mymap
d  is not an elements of mymap
e  is not an elements of mymap
f  is not an elements of mymap
g  is not an elements of mymap

map::size()函数 功能:返回map中元素的个数

map::swap()函数 功能:交换两个map

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::swap()函数 功能:交换两个map
    //map::size()函数 功能:返回map中元素的个数 
	map<char,int>foo;
	map<char,int>bar;
	map<char,int>::iterator it;
	foo['x']=1;
	foo['y']=2;
	foo['z']=3;
	bar['a']=4;
	bar['b']=5;
	cout<<"before swap foo contains:"<<endl;	
	for(it=foo.begin();it!=foo.end();it++){
		cout<<(*it).first<<"->"<<(*it).second<<endl; 
	}
	cout<<"size of foo: "<<foo.size()<<endl; 
	cout<<"before swap bar contains:"<<endl;	
	for(it=bar.begin();it!=bar.end();it++){
		cout<<(*it).first<<"->"<<(*it).second<<endl; 
	}
	cout<<"size of bar: "<<bar.size()<<endl;
	foo.swap(bar);
	cout<<"after swap foo contains:"<<endl;	
	for(it=foo.begin();it!=foo.end();it++){
		cout<<(*it).first<<"->"<<(*it).second<<endl; 
	}
	cout<<"size of foo: "<<foo.size()<<endl; 
	cout<<"after swap bar contains:"<<endl;	
	for(it=bar.begin();it!=bar.end();it++){
		cout<<(*it).first<<"->"<<(*it).second<<endl; 
	}
		cout<<"size of bar: "<<bar.size()<<endl;
}

运行结果

before swap foo contains:
x->1
y->2
z->3
size of foo: 3
before swap bar contains:
a->4
b->5
size of bar: 2
after swap foo contains:
a->4
b->5
size of foo: 2
after swap bar contains:
x->1
y->2
z->3
size of bar: 3

map::get_allocator()函数 功能:返回map的配置器

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::get_allocator()函数 功能:返回map的配置器
	int psize;
	map<char,int>mymap;
	pair<const char,int>* p;
	//allocate an array of 5 elements using mamap's allocate
	p=mymap.get_allocator().allocate(5);
	psize=(int)sizeof(map<char,int>::value_type)*5;
	cout<<"the allocated array has a size of  "<<psize<<"  bytes"<<endl;
	mymap.get_allocator().deallocate(p,5);
}

运行结果

the allocated array has a size of  40  bytes

may::key_comp()函数 功能:返回比较元素key的函数

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //may::key_comp()函数 功能:返回比较元素key的函数
	map<char,int>mymap;
	map<char,int>::key_compare mycomp;
	map<char,int>::iterator it;
	char highest;
	mycomp=mymap.key_comp();
	
	mymap['a']=1; 
	mymap['b']=3; 
	mymap['c']=4; 
	mymap['d']=5; 
	mymap['e']=2; 
	cout<<"mymap contains:"<<endl;
	highest=mymap.rbegin()->first;//key value of last element
	it=mymap.begin();
	do{
		cout<<(*it).first<<"->"<<(*it).second<<endl;
	}while(mycomp((*it++).first,highest));
	cout<<endl;
}

运行结果

mymap contains:
a->1
b->3
c->4
d->5
e->2

map::value_comp()函数 功能:返回比较元素value的函数

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::value_comp()函数 功能:返回比较元素value的函数
	map<char,int>mymap;
	map<char,int>::iterator it;
	pair<char,int>highest;
	mymap['x']=2000;
	mymap['y']=2001;
	mymap['z']=2002;
	cout<<"mymap contains:"<<endl;
	highest=*mymap.rbegin();//last element
	it=mymap.begin();
	do{
		cout<<(*it).first<<"->"<<(*it).second<<endl;
		
	}while(mymap.value_comp()(*it++,highest));
}

运行结果

mymap contains:
x->2000
y->2001
z->2002

map::lower_bound()函数 功能:返回键值大于等于(>=)给定元素的第一个位置

map::upper_bound()函数 功能:返回键值大于(>)给定元素的第一个位置

#include<iostream>
#include<map>
using namespace std;
 
int main(){
    //map::lower_bound()函数 功能:返回键值大于等于(>=)给定元素的第一个位置
    //map::upper_bound()函数 功能:返回键值大于(>)给定元素的第一个位置 
	map<char,int>mymap;
	map<char,int>::iterator it,itlow,itup;
	mymap['a']=20;
	mymap['b']=40;
	mymap['c']=60;
	mymap['d']=80;
	mymap['e']=100;
	mymap['f']=120;
	mymap['g']=140;
	itlow=mymap.lower_bound('b');//itlow points to b
	itup=mymap.upper_bound('d');//itup points to e (not d!)
	mymap.erase(itlow,itup);//erases [itlow,itup)
	//print content:
	for(it=mymap.begin();it!=mymap.end();it++){
		cout<<(*it).first<<"->"<<(*it).second<<endl;
	} 
}

运行结果

a->20
e->100
f->120
g->140

map::max_size()函数 功能:返回可以容纳的最大元素个数

#include<iostream>
#include<map>
using namespace std;
    
int main(){
	//map::max_size()函数 功能:返回可以容纳的最大元素个数 
	map<int,int>mymap;
	if(mymap.max_size()>1000){
		for(int i=0;i<10;i++)mymap[i]=1;
		cout<<"the map contains 10 elements \n";
	}
	else cout<<"the map could not hold 1000 elements\n";
	cout<<"mymap contains: ";
	map<int,int>::iterator it;
	for(it=mymap.begin();it!=mymap.end();it++){
		cout<<(*it).first<<"   "<<(*it).second<<endl; 
   }
}

运行结果

the map contains 10 elements
mymap contains: 0   1
1   1
2   1
3   1
4   1
5   1
6   1
7   1
8   1
9   1

map::equal_range()函数 功能:返回map中与给定值相等的上下限的两个迭代器

#include<iostream>
#include<map>
using namespace std;
    
int main(){
	//map::equal_range()函数 功能:返回map中与给定值相等的上下限的两个迭代器 
	//左闭右开 
	map<char,int>mymap;
	pair<map<char,int>::iterator,map<char,int>::iterator>ret;
	mymap['a']=1;
	mymap['b']=2;
	mymap['e']=4;
	mymap['c']=3;
	ret=mymap.equal_range('b');
	cout<<"lower bound points to : ";
	cout<<ret.first->first<<" ->"<<ret.first->second<<endl;
	cout<<"upper bound points to : ";
	cout<<ret.second->first<<" ->"<<ret.second->second<<endl;
}

运行结果

lower bound points to : b ->2
upper bound points to : c ->3

multimap::count()函数 与map::count()有区别

#include<iostream>
#include<map>
using namespace std;

int main(){
	//multimap::count()函数 与map::count()有区别 
	map<char,int>mymap;
	mymap['a']=1;
	mymap['a']=2;
	mymap['a']=3;
	cout<<"map count 'a'"<<mymap.count('a')<<endl;//只输出1 
	
	multimap<char,int>mymultim;
	mymultim.insert(pair<char,int>('a',1));
	mymultim.insert(pair<char,int>('a',2));
	mymultim.insert(pair<char,int>('a',3));
	cout<<"multimap count 'a'"<<mymultim.count('a')<<endl;//输出3 
	
	
	multimap<char,int>mymm;
	multimap<char,int>::iterator it;
	char c;
	mymm.insert(pair<char,int>('x',1));
	mymm.insert(pair<char,int>('y',2));
	mymm.insert(pair<char,int>('y',3));
	mymm.insert(pair<char,int>('y',4));
	mymm.insert(pair<char,int>('z',5));
	mymm.insert(pair<char,int>('z',6));
	mymm.insert(pair<char,int>('y',1));
	mymm.insert(pair<char,int>('z',1));
	for(c='x';c<='z';c++){
		cout<<"there are "<<(int)mymm.count(c);
		cout<<" elements with key  "<<c<<"  :";
		for(it=mymm.equal_range(c).first;it!=mymm.equal_range(c).second;++it)
		  cout<<" "<<(*it).second;
		cout<<endl;
	}

}

运行结果

map count 'a'1
multimap count 'a'3
there are 1 elements with key  x  : 1
there are 4 elements with key  y  : 2 3 4 1
there are 3 elements with key  z  : 5 6 1