您的位置:首页 > 编程语言 > C语言/C++

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

2014-05-24 00:31 393 查看
一、标准库类型string

头文件#include <string>

1.1 定义和初始化string对象

[cpp] view
plaincopy





string s1; //默认初始化,s1是一个空串

string s2(s1); //s2是s1的副本

string s2=s1; //等价于s2(s1),s2是s1的副本

string s3("value"); //s3是字面值“value"的副本,除了字面值最后的那个空字符外

string s3 = "value"; //等价于s3("value"),s3是字面值"value"的副本

string s4(n,'c'); //把s4初始化为由连续n个字符c组成的串

string s5 = "hiya"; //拷贝初始化

string s6("hiya"); //直接初始化

1.2 string对象上的操作

读写string操作

[cpp] view
plaincopy





#include <iostream>

#include <string>



using namespace std;



int _tmain(int argc, _TCHAR* argv[])

{

string s;

cin >> s; //string对象会自动忽略开头的空白(空格符、换行符、制表符)

cout << s << endl;



return 0;

}

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



读取未知数量的string对象

[cpp] view
plaincopy





#include <iostream>

#include <string>



using namespace std;



int _tmain(int argc, _TCHAR* argv[])

{

string word;

while (cin >> word) //反复读取,直至到达文件末尾

cout << word << endl;



return 0;

}

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

使用getline读取一整行

[cpp] view
plaincopy





#include <iostream>

#include <string>



using namespace std;



int _tmain(int argc, _TCHAR* argv[])

{

string line;

//每次读入一行,直到文件末尾

while ( getline(cin, line))

cout << line << endl;



return 0;

}

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

string 的empty和size操作

比较string对象

为string对象赋值

两个string对象相加

字面值和string对象相加

二、标准库类型vector

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

定义和初始化vector对象

[cpp] view
plaincopy





vector<int> ivec; //初始状态为空

vector<int> ivec2(ivec);

vector<string> articles = {"a", "an", "the"};

向vector对象中添加元素

成员函数push_back

vector不能使用下表添加元素

三、迭代器

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

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

迭代器运算符

[cpp] view
plaincopy





*iter //返回迭代器iter所指元素的引用

++iter //所指下一元素

--iter //所指上一元素

iter1 == iter2 //判断是否相等

iter1!= iter2 //不相等

迭代器类型

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

[cpp] view
plaincopy





vector<int>::iterator it; //it能读写vector<int>的元素

string::iteraotr it2; //it2能读写string对象中的字符



vector<int>::const_iterator it3; //it3只能读取元素,不能写元素

string::const_iterator it4; //it4只能读字符,不能写字符

迭代器运算

[cpp] view
plaincopy





iter + n

iter - n

iter1 += n

iter1 -= n

iter1 - iter2

>, >=, <, <=

四、数组

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

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

字符数组的特殊性

[cpp] view
plaincopy





char a2[] = {'C', '+', '+', '\0'}; //列表初始化,含有显式的空字符

char a3[] = "C++"; //自动添加表示字符串结束的空字符

const char a4[6] = "Daniel"; //错误:没有空间可存放空字符

C风格字符串

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

C标准 string 函数

[cpp] view
plaincopy





strlen(p); //返回p的长度,空字符不计算在内

strcmp(p1,p2); //比较p1和p2的相等性 == 0, > 1 < -1

strcat(p1,p2); //将p2附加在p1之后,返回p1

strcpy(p1,p2); //将p2拷贝给p1,返回p1

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

比较字符串

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

与旧代码的接口

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

[cpp] view
plaincopy





string s("Hello world"); //s的内容是Hello world

char *str = s; //错误: 不能用string对象初始化char*

const char *str = s.c_str(); //正确

使用数组初始化vector对象

[cpp] view
plaincopy





int int_arr[] = {0, 1,2,3,4,5};

vector<int> ivec(begin(int_arr),end(int_arr));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: