string类具有的优点:可以直接用四则运算符和关系运算符,简化了字符串类型的操作。
string string1="22",string2="11";
string1+=string2; //类似于strcat
int length=string1.length(); //类似于strlen,也可以用string.size();
bool judge=string1>string2; //类类似于strcmp
小紫书中例代码详解:
#include
#include
#include
using namespace std;
int main(void){
string str;
stringstream ss;
while(getline(cin,str)){ //getline函数的返回值是其中的流cin。一旦cin读取错误就是false。
ss<> a) sum+=a; //当流里没有东西的时候,退出循环。
cout<
2.模板:
模板是为了,使类或者函数具有通用型,不仅限于一种数据类型或者一种成员结构。
现定义一个可以任意交换类型的模板(注意模板只能在全局或者命名空间内定义,不可以在main函数或者自定义函数内定义。)
template //class为固定关键字,也可以用等效的typename.
void swap1(T &a,T &b){
T temp;
temp=a;
a=b;
b=temp;
}
3. 容器vector:
vector v;
v.begin(); //容器的起始位置
v.end(); //容器最后一个位置后的位置
v.front();v.back(); //返回第一个元素(最后一个元素,但不判断时候存在
v.empty(); //返回是否容器为空
v.clear(); //清空容器
v.erase(m); //删除m位置的数据,并返回下一个数据的地址(m是迭代器)
v.erase(m,n); //删除m到n之间的数据,并返回下一个数据的地址
v.push_back(element); //压入一个元素到末端
v.pop_back(); //弹出最后一个元素
v.reserve(100);v.resize(101); //resize已经创建空间如果再v.push_back();空间就会到101,而reserve只是预留空间并没有真正创建,v.push_back();只是在第1位
v.size();v.capacity(); //size表示的是已经创建的空间大小也可以表示元素个数可用v[]的形式直接访问,capacity容器容量,是预留空间并没有实际创建
swap(a,b); //交换两个元素的位置如:swap(v[0],v[1]);
vector v(10); //创建一个前十个元素为int的容器
vector v(10,string("I")); //使容器的前10个元素都为string型,并且都初始化为I
vector v1(v2); //对于已经存在的v2创建一个v1副本
v.insert(place,element);
v.insert(place,n,element); //在place(迭代器)位插入n个元素
注:对vector元素的访问可以用类似c语言的v[],但是最好用v.at(),它会检查是否越界更安全
总结:vector即具有数组的特性由增加了一些功能十分好,简化代码的函数,还可以通过原生的v.push_back()动态增加长度,十分好用。
4.集合set(特点是不会存在有重复的元素):
#include
set s; //创建一个整型集合:s
s.insert(element); //插入一个元素,并会自动排序(在没有自定义的情况下,缺省升序排列)
s.size(); //当前容器中元素个数
copy(s.begin(), s.end(), ostream_iterator(cout, "\n")); //#include 中的函数:输出全部集合中的元素,并在每个元素后面接换行符
5.映射map(关联容器):
#include
6.栈stack:
#include
stack stack1; //在是默认以deque为容器的
stack1.push(element);
stack1.pop();
stack1.empty(); //是否为空
stack1.size(); //元素个数
stack1.top(); //判断是否为栈顶元素
7.队列queue:
#include
queue queue1;
queue1.push(element); //加入队列顶部
queue1.pop(); //弹出队列里第一个元素
queue1.back(); //队列最后一个元素
queue1.front(); //队列第一个元素
queue1.size(); //队列元素个数
queue1.empty; //队列是否为空
8.优先队列priority_queue:
#include
priority_queue,less> pqueue1; //默认容器为vector,其中less算子,表示小的先出队
priority_queue,greater> pqueue1; //大的先出队
//优先队列与队列相比,只是按照指定的算子将队列内部排序,让后在操作排序后的栈顶元素。
9.二元组pair:
#include
pair palce; //定义一个二元组。
palce.first=1;
palce.second=2;
//对于pair类可以直接用关系运算符,比较规则是:先对第一个元素比较,若第一个元素相等再对第二个元素比较。
//由于可以用比较运算符,可以把pair作为vector的元素,再用sort排序
10.全排列函数:next_permutation
#include
//要求一个元素全不相同的长度为n的排列的个数是n!个,方法是:先把排列升序排列,然后求,直到next_permutation()的返回值为false(next_permutaion()已经是最后一个排列之后会返回false,其余返回true,如果返回最后一个之还在继续使用就会循环到第一个。)
char a[9]={1,2,3,32,36,56,34,24};
sort(a,a+8);
do{
cout << a <