string

使用string类必须包含头文件#include<string>

string对象的初始化

1.默认初始化

string s1;

2.拷贝初始化

string s4=s1;
string s5="qwer";

3.直接初始化

string s3("qwer");
string s5="qwer";
string s6(10,'c');

上述代码的运行结果

void stringinit()
{string s1;string s2(s1);string s3("qwer");string s4=s1;string s5="qwer";string s6(10,'c');cout<<s1<<","<<s2<<","<<s3<<","<<s4<<","<<s5<<","<<s6<<endl;
}

从上述结果可以看出,如果等号右边的值或者括号内的值相同,那么拷贝初始化和直接初始化是没有区别的

但实际上,二者调用的函数不同,拷贝初始化调用的是拷贝构造函数,而直接初始化调用的是对应的构造函数

string对象如果执行默认初始化(事实上调用的是无参构造函数),那么对象的默认值是空串

string  size函数的返回值

string的size函数返回的是string::size_type,并不是int,string::size_type是一个无符号的数据类型,可以存储下任何大小的string对象

string对象与字符串字面值

string对象(如string tmp="qwer";)与字符串字面值(如"qwer")看起来相似,但是类型完全不同。因为C++中的字符串字面值不存在加法运算,所以无法对两个字符串字面值进行相加操作(下面代码中第二个res5)

string类将operator+运算符函数定义为非成员函数,而该函数的参数的类型是const string &,又因为const变量的引用可以绑定常量,也可以绑定string对象,所以 string对象可以与字符串字面值相加,也可以与string对象相加。

所以,下面代码中res1等价于operator+("abc", tmp);res2等价于operator+(tmp,"abc")。res3等价于operator+(operator+(res1,","), res2),res4同理

void stringandlitreal()
{   string tmp="qwer";string res1="abc"+tmp;string res2=tmp+"abc";string res3=res1+", "+res2;string res4=res3+"qwer"+"abc";string res5="qwer"+res3+"abc";string res5="abc"+"qwer";//加上这句代码,编译无法通过
}

vector

vector类似C语言中的数组,是C++标准库中的模板类,使用vector时,需要包含头文件 #include<vector>

vector的初始化(以int为例)

1.默认初始化

vector<int> v;

2.列表初始化

vector<int> v2={1,2,3,4};
vector<int> v3{1,2,3,4};

3.拷贝初始化

vector<int> v4=v2;

4.直接初始化

vector<int> v5(v2);
vector<int> v6(10,1);

5.用数组初始化vector,也是直接初始化的一种

int a[5]={1,2,3};
vector<int> v9(a, a+sizeof(a)/sizeof(int));

代码

void vectorinit()
{vector<int> v1;//默认初始化,无任何元素vector<int> v2={1,2,3,4};vector<int> v3{1,2,3,4};vector<int> v4=v2;vector<int> v5(v2);vector<int> v6(10,1);//初始化十个元素,每个都是1vector<int> v7(10);//初始化10个元素,都是0cout<< v1.size()<<endl;for (vector<int>::size_type i=0;i<v6.size();++i) {cout<<v6[i];}for (vector<int>::size_type i=0;i<v7.size();++i) {cout<<v7[i];}int *p=&v2[0];int &r=v2[0];vector<int *> v8(10, p);//可以定义指针的vector//vector<int &> v9(10,r);//不能定义引用的vectorint a[5]={1,2,3};vector<int> v9(a, a+sizeof(a)/sizeof(int));for (std::vector<int>::size_type i=0;i<v9.size();++i) {cout<<v9[i]<<endl;}
}

运行结果

默认初始化的vector无任何元素,vector<int> v6(10,1)调用构造函数初始化10个元素,每个元素都是1,vector<int> v7(10)调用构造函数初始化10个元素,都是0。

因为vector中存储的是变量或对象,而引用只是个别名,不是对象,所以不能定义引用的vector

也可以向vector对象传入数组的任意两个元素的地址,用来初始化vector

vector中存储string与列表初始化

void stringinvector()
{vector<string> v1{10, "hi"};//等价于vector<string> v1(10, "hi")vector<string> v3{10};//等价于vector<string> v3(10)vector<string> v4{"hi"};cout<<v1.size()<<","<<v3.size()<<","<<v4.size()<<endl;for (vector<string>::size_type i=0;i<v1.size();++i) {cout<<v1[i];}cout<<endl;for (vector<string>::size_type i=0;i<v3.size();++i) {cout<<v3[i];}cout<<endl;for (vector<string>::size_type i=0;i<v4.size();++i) {cout<<v4[i];}
}

代码的执行结果显示v1的大小为10,元素都是hi,v3的大小为10,元素都是空串,v4的大小为1,元素是hi

当使用列表初始化的方法初始化存储string的vector时,vector<string> v1{10, "hi"}的初始化结果和vector<string> v1(10, "hi")相同,vector<string> v3{10}的初始化结果和vector<string> v3(10)相同

vector元素的添加和访问

当向vector中添加元素时,可以使用函数push_back(),该方法将元素添加到vector的尾部,如果想要访问vector中的某个元素,可以使用下表访问,类似于数组,也可以使用迭代器

string,char数组,char指针

可以用char数组或者char指针初始化string,但是反之不行

void stringandchar()
{char chararray[10]={'a','b',97};string str=chararray;//char chararray1[10]=str;cout<<str<<str.size()<<endl;
}

上述代码用char数组初始化string,反之则不可以

如果想用string对象初始化char指针,需要调用string对象的c_str()函数,c_str的返回值是const char *,需要将左值用const修饰,否则会报错

正确做法如下:

void stringandchar()
{char chararray[10]={'a','b',97};string str=chararray;//char chararray1[10]=str.c_str();cout<<str<<str.size()<<endl;const char *charp=str.c_str();cout<<charp<<endl;
}

参考:

《C++ Primer》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点4——vector与string简述相关推荐

  1. 8.了解如何把vector和string数据传给旧的API

    vector和string都是使用连续内存来存储数据,可以类似于普通数组进行处理. std::vector<int> datas; std::string strData; 获取vecto ...

  2. 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化

    1.插入元素 (1)对于vector.string来说,当在某个位置插入元素后,如果内存空间重新分配,则指向任何位置的迭代器.指针.引用都会失效: 如果内存空间没有重新分配,则在插入位置之前的迭代器. ...

  3. 获取顺序容器vector,deque,string和array的首尾元素的方法有四个

    获取顺序容器vector,deque,string和array的首尾元素的方法有四个: (1)迭代器 (2)下标 (3)front() 和 back()成员函数 (4)at()成员函数 如下所示,得到 ...

  4. 使用reserve函数避免vector和string的内存重新分配

    vector和string内部维护的内存会"自动增长",以便容纳不断放入其中的元素.调用max_size()可以返回其容量的最大限制. "自动增长"的过程如下: ...

  5. vector和string

    我这里不是将他们的区别,主要讲使用他们时要注意的一些问题,主要体现在内存方面. C++中,我们很少使用C中的数组,使用数组就意味着承担: new一个数组以后,必须保证有delete来删除所分配的内存. ...

  6. 【S13】vector和string优先于动态分配的内存

    1.使用new动态分配内存,必须承担如下责任: a.使用delete释放内存: b.确保使用了正确的形式,delete与new的形式要匹配: c.不能重复delete. 2.使用vector和stri ...

  7. c语言vector+erase用法,C/C++知识点之vector使用篇erase

    本文主要向大家介绍了C/C++知识点之vector使用篇erase,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助. 由于最近项目使用中发现了之前对vector的一个误区,由此发现自 ...

  8. STL标准模板库中的vector、string、deque、stack、list、set和map的详细介绍——C++学习记录01

    文章目录: 1.vector 1.1 遍历方式 1.2 构造函数 1.3 容量大小问题 1.4 插入和删除 1.5 存取值 1.6 交换两个vectot的元素 1.7 预定义存储空间 2.string ...

  9. EC3-13 Prefer vector and string to dynamically allocated arrays

    用new动态分配内存时,意味着还需要:确保之后会delete删除分配的内存,正确的使用delete和delete[],确保一个分配只delete一次. 然而用vector和string,就可以避免这些 ...

最新文章

  1. 基于.htaccess的Web Shell工具htshells
  2. ccf-csp #201812-2 小明放学 (100分 附解析)
  3. 【每周NLP论文推荐】 开发聊天机器人必读的重要论文
  4. Java开发环境的搭建(JDK和Eclipse的安装)
  5. 【大话设计模式】设计模式系统学习大合集
  6. c语言八个方向迷宫课程设计,【精品资料最新版】C语言课程设计-迷宫游戏.doc...
  7. LeetCode 14. 最长公共前缀
  8. 将iso镜像包设置成yum源_Centos7 Nginx搭建局域网yum仓库详细步骤,转发
  9. Idea在debug时打上断点没有用 Skipped breakpoint at ... because it happened inside debugger evaluation
  10. 返回零长度的数组或者集合,而不是null
  11. javafx 与java,java桌面应用程序和javafx有什么区别?
  12. 【面试题系列|前端面试题】前端高频面试题总结(2021年最新版)
  13. JDK动态代理介绍与使用
  14. matlab循环求微分方程,MATLAB解微分方程
  15. Word删除连续分节符
  16. ubuntu 制作gif 动态图片
  17. 手游SDK-数据上报
  18. 201621123030《Java程序设计》第3周学习总结
  19. 计算机网络学习笔记(3.数据链路层 4.网络层)
  20. 虚拟机遇锁定文件失败问题

热门文章

  1. PowerShell收发TCP消息包
  2. 理解在javascript中的内存泄露
  3. spark-submit参数说明--on YARN
  4. AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结
  5. 关于常用mysql的文件
  6. (一)python简单应用
  7. 数据类型 类型检测
  8. 理解VMware虚拟网络
  9. [LeetCode-JAVA] Reverse Nodes in k-Group
  10. ASP.NET那点不为人知的事(四)