C++ Primer中文版(第五版)--第三章 字符串、向量和数组

本文详细介绍了C++标准库中的string和vector类型,包括定义、初始化、操作方法及迭代器使用等内容。此外还对比了数组和C风格字符串的特点,并提供了与旧代码兼容的方法。

一、标准库类型string

  头文件#include <string>

1.1  定义和初始化string对象

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. string s1;               //默认初始化,s1是一个空串  
  2. string s2(s1);           //s2是s1的副本  
  3. string s2=s1;            //等价于s2(s1),s2是s1的副本  
  4. string s3("value");      //s3是字面值“value"的副本,除了字面值最后的那个空字符外  
  5. string s3 = "value";     //等价于s3("value"),s3是字面值"value"的副本  
  6. string s4(n,'c');        //把s4初始化为由连续n个字符c组成的串  
  7. string s5 = "hiya";      //拷贝初始化  
  8. string s6("hiya");       //直接初始化  

1.2 string对象上的操作

  读写string操作

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3.   
  4. using namespace std;  
  5.   
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     string s;        
  9.     cin >> s;  //string对象会自动忽略开头的空白(空格符、换行符、制表符)  
  10.     cout << s << endl;  
  11.   
  12.     return 0;  
  13. }  

在执行读取操作时,string对象会自动忽略开头的空白,并从第一个真正的字符开始读起,直到遇到下一处空白为止。

  

 读取未知数量的string对象

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3.   
  4. using namespace std;  
  5.   
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     string word;  
  9.     while (cin >> word)  //反复读取,直至到达文件末尾  
  10.         cout << word << endl;  
  11.   
  12.     return 0;  
  13. }  

window系统中,按Ctrl + C结束。


使用getline读取一整行

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3.   
  4. using namespace std;  
  5.   
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     string line;  
  9.     //每次读入一行,直到文件末尾  
  10.     while ( getline(cin, line))  
  11.         cout << line << endl;  
  12.   
  13.     return 0;  
  14. }  

这里getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符而止(注意换行符也被读进来了),然后把所读的内容存入到那个string对象中去(注意不存换行符)。


string 的empty和size操作

比较string对象

为string对象赋值

两个string对象相加

字面值和string对象相加


二、标准库类型vector

使用的时候需要使用<vector>


定义和初始化vector对象

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. vector<int> ivec;      //初始状态为空  
  2. vector<int> ivec2(ivec);  
  3. vector<string> articles = {"a""an""the"};  

向vector对象中添加元素

成员函数push_back

vector不能使用下表添加元素


三、迭代器

所有标准容器都可以使用迭代器,但是只有少数几种才同时支持下表操作。vector和string支持下表操作,同时也支持迭代器

有迭代器的类型同时拥有返回迭代器的程序,比,这些类型都拥有begin和end的成员


迭代器运算符

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. *iter   //返回迭代器iter所指元素的引用  
  2. ++iter  //所指下一元素  
  3. --iter  //所指上一元素  
  4. iter1 == iter2 //判断是否相等  
  5. iter1!= iter2  //不相等  

迭代器类型

一般我们不需要清楚迭代器的精确类型。事实上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. vector<int>::iterator it;    //it能读写vector<int>的元素  
  2. string::iteraotr it2;        //it2能读写string对象中的字符  
  3.   
  4. vector<int>::const_iterator it3; //it3只能读取元素,不能写元素  
  5. string::const_iterator it4;      //it4只能读字符,不能写字符  

迭代器运算

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. iter + n  
  2. iter - n  
  3. iter1 += n  
  4. iter1 -= n  
  5. iter1 - iter2  
  6. >, >=, <, <=  

四、数组

数组是一种类似于标准库类型vector的数据结构,如果在不清楚元素的确定个数,请使用vector

数组的维度必须是一个常量表达式。


字符数组的特殊性

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. char a2[] = {'C''+''+''\0'}; //列表初始化,含有显式的空字符  
  2. char a3[] = "C++";                 //自动添加表示字符串结束的空字符  
  3. const char a4[6] = "Daniel";       //错误:没有空间可存放空字符  

C风格字符串

C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。按此习惯写的字符串存放在字符数组中并以空字符结束。以空字符结束的意思是在字符串最后一个字符后面跟着一个空字符。


C标准 string 函数

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. strlen(p);      //返回p的长度,空字符不计算在内  
  2. strcmp(p1,p2);  //比较p1和p2的相等性  == 0, > 1 < -1  
  3. strcat(p1,p2);  //将p2附加在p1之后,返回p1  
  4. strcpy(p1,p2);  //将p2拷贝给p1,返回p1  

此类函数的指针必须指向空字符作为结尾的数组。


比较字符串

比较标准库 string对象的时候,用的是普通的关系运算符和相等运算符。要比较C风格的,必须调用strcmp函数


与旧代码的接口

混用string对象和C风格字符串

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. string s("Hello world"); //s的内容是Hello world  
  2. char *str = s; //错误: 不能用string对象初始化char*  
  3. const char *str = s.c_str();  //正确  

使用数组初始化vector对象

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int int_arr[] = {0, 1,2,3,4,5};  
  2. vector<int> ivec(begin(int_arr),end(int_arr));  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值