【C++容器和string类】vector、stack、queue、string

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个字符

猜你喜欢

转载自www.cnblogs.com/wwj321/p/12381569.html
今日推荐