vector
头文件:#include<vector>
1. 创建普通变量
vector<int> x(v[1]); //用v[1]初始化
vector<int> y=v[2]; //用v[2]初始化
vextor<string> sevc{"vb","vc"}; //字符串初始化
2. 指定数量的元素
vector<int> ivec(10,-1); //10个int元素,每个都初始化为-1,若不指定-1则均初始化为0;
vector<string> svec(10,"hello") ; //均已“hello”初始化
3. 创建二维数组
vector<vector<ing>> arr(2,vector<int>(5)); //相当于二维数组a[2][5];
vector<int> V[10]; //表示10个容器
4. 迭代器,相当于指针
vector<int>::iterator it; //it读写vector<int>中的元素
string::iterator st; //读写string对象中的字符
vector<int>::const_iterator it2; //it2只能读元素,不能写元素
string::const_iterator it3; //it3只能读字符,不能写字符
使用方法eg:
int a[6]={1,2,3,4,5,6};
vector<int> b(a,a+4);
for(vector<int>::iterator it=b.begin();it!=b.end();it++)
{
cout<<*it<<" ";
}
5. 常用部分:
V.begin(); //开始
V.end(); //结尾
V.push_back(1); //将元素1压入
V.pop_back(); //删除容器最后一个元素
V.empty() //判断容器是否为空
V.size(); //返回容器大小
V[3]; //取第三个元素此种类型的下标只能获取已经存在的元素,若不存在只能用push_back()压入
6. 常用的初始化方式
(1).清空元素,但不回收空间:
V.clear();
(2).使用erase循环删除,不回收空间
vector<int>::iterator it;
for(it=v.begin();it!=v.end();)
{
//注意使用erase()方法时,迭代不要随意的++
it = vecnum.erase(it);
}
注:erase在每次操作时,迭代器指针会整体前移1,就是每次都会移动全部数据,所以vector不适合做频繁删除的容器
erase还有一种用法:iterator erase(iterator first,iterator last)
即删除first和last之间的元素,返回值:指向删除元素(或范围)的下一个元素。
eg:vector v中保存的为{1,2,3,4,5,6,7,8},执行:
v.erase(v.begin(),v.begin()+5);
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
{
cout<<*it<<endl;
}
得到结果:
(3).最简单的使用swap,清除元素并回收内存
// 写法一
vector<int>().swap(vecnum);
//写法二
vecnum.swap(vector<int>());
7. 其他一些不太常用的操作
//将a的现有元素个数调至10个,多则删,少则补,其值随机
a.rezize(10);
//将a的现有元素个数调至10个,多则删,少则补,其值为2
a.rezize(10,2);
//在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
a.insert(a.begin()+1,5);
//在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.insert(a.begin()+1,3,5);
//b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
a.insert(a.begin()+1,b+3,b+6);
//b为向量,将b的0~2个元素构成的向量赋给a
a.assign(b.begin(), b.begin()+3);
//定义了a值为b中第0个到第2个(共3个)元素 初始化
vector<int>a(b.begin(),b.begin+3);
stack
头文件:#include<stack>
1. 常用部分
stack<int> S; //定义
count=S.size(); //count为栈中元素数目
a=S.top(); //a为栈顶元素
S.pop(); //弹出栈顶元素
S.push(a); //在栈顶增加元素
bool=S.empty(); //堆栈为空则返回真
queue
头文件:#include<queue>
1. 常用操作
queue<int> Q;
Q.push(1); //1入队列
Q.pop(); //返回队列第一个值 //只能直接弹出,不能带返回值
x=Q.top() //可以获取队头元素即下一个即将弹出队列的元素
//结合起来 即若想弹出队列第一个元素并且带有返回值:
//x=Q.front(); Q.pop();
Q.back() //队尾元素
Q.size() //元素个数
附:优先队列可用作大顶堆or小顶堆,定义优先队列方式:
priority_queue<int> Q; //默认为大顶堆
priority_queue <int,vector<int>,greater<int> > q; //升序队列,取出的为队列中最小的元素,相当于小顶堆
priority_queue <int,vector<int>,less<int> >q; //降序队列,相当于大顶堆
string
头文件:#include<string>
1.定义及初始化
string s1; //默认构造函数,s1位空串
string s2(s1); //将s2初始化为s1的一个副本
string s3("value"); //将s3初始化为一个字符串字面值副本
string s4(n,'c'); //将s4初始化为字符'c'的n个副本
string s(cp,n); //创建一个string对象,它被初始化为cp所指向数组的前n个元素副本
string s(s2,pos2); //创建一个string对象,它被初始化为一个已存在的string对象s2中从下标pos2开始的字符的副本如果pos2>s.size(),则该操作未定义
string s(s2,pos2,len2); //创建一个string对象,它被初始化为s2中从下标pos2开始的len2个字符的副本如果pos2>s2.size(),则该操作未定义无论len2的值是多少,最多只能复制s2.size()-pos2个字符
2.string 读写
cin>>s;
a.读取并忽略开头所有的空白字符(如空格,换行符,制表符,进纸符)
b.读取字符直至再次遇到空白符,读取终止
3.string 对象操作
s.empty(); //如果s为空串,则返回true,否则返回false
s.size(); //返回s 中字符的字符个数
s[n] //返回s中位置为n的字符,位置从0开始计数
s1+s2 //把s1和s2链接成一个新的字符串,返回新生成的字符串!!!注意不能使用类似:`str+'A'` (string+字符)!!!
s1=s2; //把s1内容替换为s2的副本
v1==v2; //判断v1与v2的内容,相等则返回true,否则返回false
!=, <, <=, >, >=,+= //保持这些操作的惯有含义
4.修改string对象
迭代器定义:string::iterator it
//关于迭代器
s.insert(p,t); //在迭代器p指向的元素之前插入一个值为t的新元素。返回指向新插入元素的迭代器
s.insert(p,n,t); //在迭代器p指向的元素之前插入n个值为t的新元素。返回void
s.insert(p,b,e); //在迭代器p指向的元素之前插入b和e标记范围内所有的元素,返回void
s.assign(b,e); //用迭代器b和e标记范围内的元素替换s。对于string类型,该操作返回s,对于容器类型,则返回void
s.assign(n,t); //用值为t的n个副本替换s。对于string类型,该操作返回s,对于容器类型,返回void
s.erase(p); //删除迭代器p指向的元素,返回一个迭代器,指向被删除元素后面的元素
s.erase(b,e); //删除迭代器b和e标记范围内所有的元素,返回一个迭代器,指向被删除元素段后面的第一个元素
reverse(b,e); //把迭代器b和e标记范围内的所有元素反转
//关于使用数组下标
s.insert(pos,n,c); //在下表pos的元素之前插入n个字符c
s.insert(pos,s2); //在下标为pos的元素之前插入string对象s2的副本
s.insert(pos,s2,pos2,len); //在下标为pos的元素之前插入s2中从下标pos2开始len个字符
s.insert(pos,cp,len); //在下标为pos的元素之前插入cp所指向数组的前len个字符
s.insert(pos,cp); //在下标为pos的元素之前插入cp所指向的以空字符结束的字符串副本
s.assign(s2); //用s2的副本替换s
s.assign(s2,pos2,len); //用s2中从下标pos2开始的len个字符副本替换s
s.assign(cp,len); //用cp所指向数组的前len个字符副本替换s
s.assign(cp); //用cp所指向的以空字符结束的字符串副本替换s
s.erase(pos,len); //删除从下标为pos开始的len个字符