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

第三章 字符串、向量和数组(重点)

2017-03-19 17:26 211 查看

3. 字符串、向量和数组(重点)

string和vector是两种最重要的标准库类型,前者表示可变长的字符序列,后者存放的是某种给定类型对象的可变长序列。

3.1 命名空间的using声明

作用域操作符(::):编译器应从操作符左侧名字所示的作用域中寻找右侧那个名字。

每个名字都需要独立的using声明。

头文件不应包含using声明。

3.2 标准库类型 string

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

getline 函数的参数是一个输入流和一个string 对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的内容存入到那个string 对象中去(注意不存换行符)。getline 只要一遇到换行符就结束读取操作并返回结果,哪怕输入的一开始就是换行符也是如此。

size 函数返回的是一个 string::size_type 类型的值。

切记,字符串字面值与 string 是不同的类型。当把 string 对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是 string 。

建议:使用C++版本的C标准库头文件,如cctype,cname等。

使用基于范围的 for 语句,如 for (auto c : str) cout << c << endl;

string 对象的下标必须大于等于 0 而小于 s.size()。不管什么时候只要对 string 对象使用了下标,都要确认在那个位置上确实有值。

无论何时用到字符串的下标,都应该注意检查其合法性。

使用 C++11 新特性时,编译命令为添加参数 -std=c++11 。

3.3 标准库类型 vector

vector是模板而非类型,模板名字后面跟一对尖括号,在括号内放上信息。

vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素。

3.4 迭代器介绍

所有标准库容器都可以使用迭代器,但是其中只有少数几种才同时支持下标运算符。有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置,其他所有情况属于无效。

某些对vector对象的操作会使迭代器失效:已知的一个限制是不能在范围for循环中向vector对象添加元素。另外一个限制是任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。

3.5 数组

与vector相似的地方是,数组也是存放类型相同的对象的容器,这些对象本身没有名字,需要通过其所在位置访问。与vector不同的地方是,数组的大小确定不变,不能随意向数组中增加元素。维度大于等于0。

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

要想防止数组下标越界,除了小心谨慎注意细节以及对代码进行彻底的测试之外,没有其他好办法。

在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。

int *e = &arr[10]; //指向arr尾元素的下一个位置的指针。特别注意,尾后指针不能执行解引用和递增操作。

标准库类型限定使用的下标必须是无符号类型,而内置的下标运算符所用的索引值不是无符号类型。

尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。

以空字符结束的意思是在字符串最后一个字符后面跟着一个空字符(‘\0’)。strlen函数将沿内存位置不断向前寻找,直到遇到空字符才停下来。

不能用string对象直接初始化指向字符的指针,相反的,允许使用数组来初始化vector对象。

现代的C++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;应该尽量使用string,避免使用C风格的基于数组的字符串。

3.6 多维数组

严格来说,C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。一个维度表示数组本身大小,另外一个维度表示其元素大小。

要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。

int *ip [4]
; //整型指针的数组

int (*ip) [4]
; //指向含有4个整数的数组

待完善…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++