个人怎样做网站,安阳房产信息网,美工网站设计收费,网站建设 骏域网络建设专家广州类#xff1a; pair:
头文件#xff1a;utility
定义#xff1a;
是一个标准库类型。可以看作是有两个成员变量first和second的结构体#xff0c;并且重载了运算符(先比较first大小#xff0c;再比较second大小)当我们创建一个pair时#xff0c;必须提供两… 类 pair:
头文件utility
定义
是一个标准库类型。可以看作是有两个成员变量first和second的结构体并且重载了运算符(先比较first大小再比较second大小)当我们创建一个pair时必须提供两个类型
创建一个pairpairstring,int p
函数返回make_pair(v1,v2)
函数返回由v1,v2初始化的pair类型可以从v1,v2的类型推断出来 动态数组(数组的下标从0开始) 头文件vector
定义一个动态数组vectorint a
插入元素a.push_back()
获取长度a.size()
删除元素:a.pop_back()只能在末端操作
迭代器
std: :vectorint: :inerator it //it只能读写vectorint的元素
std: :vectorint: :const_inerator it //it只能读vectorint的元素不可以修改vectorint中的元素
for( it vector.begin(); it ! vector.end(); it )cout*itendl; for( std::vectorint::reverse_iterator it v.rbegin(); it!v.rend();it )cout*itendl;
清空clear()
只会清空数据不会清空内存
#includeiostream
using namespace std;
int main(){vectorint a;//[]//插入元素a.push_back(1);//[1]a.push_back(2);//[1,2]a.push_back(3);//[1,2,3]//获取长度for(int i0;ia.size();i){couta[i]endl;}//修改元素a[0]2;//[2,2,3]//删除元素a.pop_back();//[2,2]a.pop_back();//[2]return 0;
} 高级用法
动态数组不仅仅可以存储基本的数据类型还能存储自定义数据类型比如结构体
#includeiostream
#includevector
using namespace std;
struct student{string name;int age;
};
int main(){vectorstudent class1;//创建动态数组班级 student stu1,stu2;//学生1学生2 stu1.name小明;stu1.age13;stu2.name小红;stu2.age14;//将两个学生导入到班级数组里面去 class1.push_back(stu1);class1.push_back(stu2);for(int i0;iclass1.size();i){cout第i1名学生;cout姓名class1[i].nameendl;cout年龄class1[i].ageendl;}return 0;
}
构造函数
批量初始化vectorint a(初始化动态数组的长度,初始的数组里面每个元素的值)
#includeiostream
#includevector
using namespace std;
int n10;
vectorint a(n,1);
int main(){for(int i0;ia.size();i){couta[i]endl;}return 0;
}
二维动态数组vector vectorint vec2
注意int 中间有一个空格这个空格一定要加上否则在一些老版本的编译器上不能通过编译
#includeiostream
#includevector
using namespace std;
int n5;
vectorvectorint a;
int main(){for(int i0;in;i){vectorint x(i1,1);a.push_back(x); } for(int i0;in;i){for(int j0;ja[i].size();j){couta[i][j] ;}coutendl;}/*11 11 1 11 1 1 11 1 1 1 1*/return 0;
}
二维动态数组的每一维长度都可以不一样可以是任意形状的。借助构造函数我们可以快速的构造一个n行m列的动态数组每个元素的初始值为0vectorvectorint vec2(n,vectorint(m,0))
#includeiostream
#includevector
using namespace std;
//定义一个n行m列的二维动态数组
//先要初始化不能为空的时候使用
int n10,m5;
vectorvectorint vec2(n,vectorint(m,0));
int main(){return 0;
} #includeiostream
#includevector
using namespace std;
vectorvectorint v2d;
int main(){for(int i0;i5;i){v2d.push_back(vectorint());}for(int i0;iv2d.size();i){for(int j0;ji;j){v2d[i].push_back((i1)*(j1));}}for(int i0;iv2d.size();i){for(int j0;ji;j){couti1*j1v2d[i][j] ;}coutendl;}return 0;
/*
1*11
2*12 2*24
3*13 3*26 3*39
4*14 4*28 4*312 4*416
5*15 5*210 5*315 5*420 5*525
*/
} 集合set:去除重复 头文件set
定义一个集合setstring a
插入元素a.insert( )
删除元素erase()
获取元素个数size()
清空clear()
clear()会帮忙清空集合同时也会清空set所占的内存
判断元素是否存在count()
如果集合中存在我们要查找的元素返回1否则会返回0
#includeiostream
#includeset
#includestring
using namespace std;
setstring a;
int main(){a.insert(China);//{China}a.insert(America);//{Chinea,America}a.insert(France);//{China,America,France} if(a.count(China)){coutChina belong to aendl; }return 0;
}
迭代器setstring: :iteratoe it
#includeiostream
#includeset
#includestring
using namespace std;
setstring country;
int main(){country.insert(China);//{China}country.insert(America);//{Chinea,America}country.insert(France);//{China,America,France} //声明一个迭代器 setstring::iterator it;for(itcountry.begin();it!country.end();it){cout*it ;} coutendl;return 0;
}
运算符重载重新定义小于符号operator
set经常会配合结构体来使用用set来存储结构体和vector有些区别。正如我们前面所说set是需要经过排序的。系统自带的数据类型有默认的比较大小的规则而我们自定义的结构体系统是不可能知道这个结构体比较大小的方式的。所以我们需要用一种方式来告诉系统怎么比较这个结构体的大小。
#includeiostream
#includeset
#includestring
using namespace std;
struct a{int x,y;bool operator(const arhs) const{ //operator 为运算符重载 if(xa.x){return yrhs.y;}else{return xrhs.x;}}//这里规定的排序方式为优先按照x从小到大排序如果x相同再按照y从大到小排序。//经过了运算符重载的结构体我们就可以比较两个Node对象的大小了因此可以直接存储在set里
};
int main(){return 0;
} #includeiostream
#includeset
#includestring
using namespace std;
struct Point{ //创建一个结构体int x, y;bool operator(const Pointrhs) const{ //进行运算符重载if(xrhs.x){ //如果x相同则对y进行排序return yrhs.y;}else{return xrhs.x; //x小的排在前面}}
};
setPoint v; //定义一个结构体类型的集合v
int main(){int n;cinn;for(int i0;in;i){Point temp;cintemp.xtemp.y ;v.insert(temp); }for(setPoint::iterator itv.begin();it!v.end();it){ //迭代器进行遍历我们的集合coutit-x it-yendl; //-为指针的用法}return 0;
}
注意
1.如果集合中已经存在了某个元素再次插入不会产生任何效果集合中是不会出现重复元素的
2.set是从小到大遍历的也就是说set会帮我们排序 映射map() 定义将关键字集合key映射到值集合value
头文件map
构造一个映射map类型1,类型2 m //将类型1映射到类型2
插入一对映射insert()
检测是否存在(存在1否则0)count()
访问及修改映射dict[Tom]1
迭代器mapstring,int: :iterator it
访问映射的长度size()
注意在C遍历map是按照关键字从小到大遍历的
#includemap
#includestring
#includeutility
using namespace std;
pairstring,int a;
mapstring,int 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));//{Tom1,Jone-2,Mary-1} if(dict.count(Mary)){ //判断元素是否存在coutMary is in classdict[Mary]endl;dict[Mary]5; }for(mapstring,int::iterator itdict.begin();it!dict.end();it){//迭代器进行遍历coutit-first is in classit-secondendl; }dict.clear(); //清空该映射return 0;
} 栈 特点只能从一个方向处理数据
头文件:stack
创造空栈stackint s
判断栈是否为空为空返回true,否则返回false: s.empty()
返回栈中元素的个数即栈的长度s.size()
获取栈顶的元素s.top()
插入元素x为新的栈顶元素s.push()
删除s栈顶元素s.pop();
注切记不要在栈为空的时候访问top会出段错误 队列 头文件queue
特点
只能访问表的首元素并删除首元素只能在表的最后端插入元素最前端的叫做队头最后端的叫做队尾
构造一个队列queueint a
入队a.push()
出队a.pop()
判断队列是否为空a.empty()
访问队首元素a.front()
访问队列的长度a.size()
清空队列一个一个地清空
//清空队列while(!a.empty()){a.pop();}