C++STL模板库

类:

pair:

头文件:

定义:

是一个标准库类型。可以看作是有两个成员变量first和second的结构体,并且重载了<运算符(先比较first大小,再比较second大小)当我们创建一个pair时,必须提供两个类型

创建一个pair:pair p

函数返回:make_pair(v1,v2)

函数返回由v1,v2初始化的pair,类型可以从v1,v2的类型推断出来

动态数组:(数组的下标从0开始)

头文件:

定义一个动态数组:vector a

插入元素:a.push_back()

获取长度:a.size()

删除元素:a.pop_back()(只能在末端操作)

迭代器:

std: :vector: :inerator it //it只能读写vector的元素

std: :vector: :const_inerator it //it只能读vector的元素,不可以修改vector中的元素

for( it = vector.begin(); it != vector.end(); it++ )
	cout<<*it<
 for( std::vector::reverse_iterator it = v.rbegin(); it!=v.rend();it++ )
    cout<<*it<

清空:clear()

只会清空数据,不会清空内存

#include
using namespace std;
int main(){
	vector a;//[]
    //插入元素
    a.push_back(1);//[1]
    a.push_back(2);//[1,2]
    a.push_back(3);//[1,2,3]
    //获取长度
    for(int i=0;i

高级用法:

动态数组不仅仅可以存储基本的数据类型,还能存储自定义数据类型,比如结构体

#include
#include
using namespace std;
struct student{
	string name;
	int age;
};
int main(){
	vector class1;//创建动态数组:班级 
	student stu1,stu2;//学生1,学生2 
	stu1.name="小明";
	stu1.age=13;
	stu2.name="小红";
	stu2.age=14;
	//将两个学生导入到班级数组里面去 
	class1.push_back(stu1);
	class1.push_back(stu2);
	for(int i=0;i

构造函数:

批量初始化:vector a(初始化动态数组的长度,初始的数组里面每个元素的值)

#include
#include
using namespace std;
int n=10;
vector a(n,1);
int main(){
	for(int i=0;i

二维动态数组:vector > vec2

注意: >中间有一个空格,这个空格一定要加上,否则在一些老版本的编译器上不能通过编译
#include
#include
using namespace std;
int n=5;
vector > a;
int main(){
	for(int i=0;i x(i+1,1);
		a.push_back(x); 
	}	
	for(int i=0;i

二维动态数组的每一维长度都可以不一样,可以是任意形状的。借助构造函数,我们可以快速的构造一个n行m列的动态数组,每个元素的初始值为0:vector > vec2(n,vector(m,0))

#include
#include
using namespace std;
//定义一个n行m列的二维动态数组 
//先要初始化,不能为空的时候使用 
int n=10,m=5;
vector >vec2(n,vector(m,0));
int main(){
	return 0;
}

#include
#include
using namespace std;
vector > v2d; 
int main(){
	for(int i=0;i<5;i++){
		v2d.push_back(vector());
	}
	for(int i=0;i

集合set:(去除重复)

头文件:

定义一个集合:set a

插入元素:a.insert(" ")

删除元素:erase()

获取元素个数:size()

清空:clear()

clear()会帮忙清空集合,同时也会清空set所占的内存

判断元素是否存在:count()

如果集合中存在我们要查找的元素,返回1,否则会返回0

#include
#include
#include
using namespace std;
set a;
int main(){
	a.insert("China");//{"China"}
	a.insert("America");//{"Chinea","America"}
	a.insert("France");//{"China","America","France"} 
	if(a.count("China")){
		cout<<"China belong to a"<

迭代器:set: :iteratoe it

#include
#include
#include
using namespace std;
set country;
int main(){
	country.insert("China");//{"China"}
	country.insert("America");//{"Chinea","America"}
	country.insert("France");//{"China","America","France"} 
	//声明一个迭代器  
	set::iterator it;
	for(it=country.begin();it!=country.end();it++){
		cout<<*it<<" ";
	} 
	cout<

运算符重载(重新定义小于符号):operator<

set经常会配合结构体来使用,用set来存储结构体和vector有些区别。正如我们前面所说,set是需要经过排序的。系统自带的数据类型有默认的比较大小的规则,而我们自定义的结构体,系统是不可能知道这个结构体比较大小的方式的。所以我们需要用一种方式来告诉系统怎么比较这个结构体的大小。

#include
#include
#include 
using namespace std;
struct a{
	int x,y;
	bool operator<(const a&rhs) const{   //operator< 为运算符重载 
		if(x==a.x){
			return y

#include
#include
#include
using namespace std;
struct Point{   //创建一个结构体
	int x, y;
	bool operator<(const Point&rhs) const{  //进行运算符重载
		if(x==rhs.x){      //如果x相同则对y进行排序
			return y v;    //定义一个结构体类型的集合v
int main(){
	int n;
	cin>>n;
	for(int i=0;i>temp.x>>temp.y ;
		v.insert(temp); 
	}
	for(set::iterator it=v.begin();it!=v.end();it++){ //迭代器进行遍历我们的集合
		cout<x<<" "<y<为指针的用法
	}
	
	
	return 0;
} 

注意:

1.如果集合中已经存在了某个元素,再次插入不会产生任何效果,集合中是不会出现重复元素的
2.set是从小到大遍历的,也就是说set会帮我们排序

映射:map()

定义:将关键字集合(key)映射到值集合(value)

头文件:

构造一个映射:map<类型1,类型2> m //将类型1映射到类型2

插入一对映射:insert()

检测是否存在(存在:1,否则:0):count()

访问及修改映射:dict["Tom"]=1

迭代器:map: :iterator it

访问映射的长度:size()

注意:在C++遍历map是按照关键字从小到大遍历的

#include
#include
#include
using namespace std;
pair a; 
map dict; 
int main(){
	dict.insert(make_pair("Tom",1));//{"Tom"->1}   //插入元素
	dict.insert(make_pair("Jone",2));//{"Tom"->1,"Jone"->2}
	dict.insert(make_pair("Mary",1));//{"Tom"=>1,"Jone"->2,"Mary"->1} 
	if(dict.count("Mary")){         //判断元素是否存在
		cout<<"Mary is in class"<::iterator it=dict.begin();it!=dict.end();it++){//迭代器进行遍历
		cout<first<<" is in class"<second<

栈:

特点:只能从一个方向处理数据

头文件:

创造空栈:stack s

判断栈是否为空(为空返回true,否则返回false): s.empty()

返回栈中元素的个数,即栈的长度:s.size()

获取栈顶的元素:s.top()

插入元素x为新的栈顶元素:s.push()

删除s栈顶元素:s.pop();

注:切记不要在栈为空的时候访问top会出段错误!!!

队列:

头文件:

特点:

  • 只能访问表的首元素并删除首元素
  • 只能在表的最后端插入元素
  • 最前端的叫做队头
  • 最后端的叫做队尾

构造一个队列:queue a

入队:a.push()

出队:a.pop()

判断队列是否为空:a.empty()

访问队首元素:a.front()

访问队列的长度:a.size()

清空队列:一个一个地清空

//清空队列
	while(!a.empty()){
		a.pop();
	} 

你可能感兴趣的:(算法,c++,数据结构)