第3章 字符串、向量和数组

位于头文件中的代码,一般来说不应该使用using声明。这是因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明。

string类型的s1+s2返回的是s1和s2字符串的拼接结果。

有时我们希望能在最终得到的字符串中保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。器从给定的输入流中读入内容,直到遇到换行符为止。如果输入真的一开始就是换行符,那么得到的结果就是一个空string。
string对象的比较:
(1)如果两个string对象的长度不同,而且较短string对象的每个字符都与较长对象对应位置上的字符相同,就说较短string对象小于较长对象。
(2)如果两个string对象在某个对应位置上不一致,则string对象比较的结果是string对象中第一对相异字符比较的结果。

在cctype头文件中定义了一组标准库函数处理字符特性:
(1)isalnum(a),当a是字母或数字时为真
(2)isalpha(a),是字母时为真
(3)iscntrl(a),是控制字符时为真
(4)isdigit(a),是数字时为真
(5)isgraph(a),不是空格且可打印时为真
(6)islower(a),是小写字母时为真
(7)isprint(a),是可打印字符时为真
(8)ispunct(a),是标点符号时为真
(9)isspace(a),是空白时为真
(10)isupper(a),是大写字母时为真
(11)isxdigit(a),是十六进制数字时为真
(12)tolower(a),如果是大写字母则输出小写字母,否则原样输出
(13)toupper(a),如果是小写字母则输出大写字母,否则原样输出

C++ 11新定义的范围for语句

for (declaration: expression)
	statement

其用于遍历操作容器中的每个元素。
范围for语句体内不应该改变其所遍历序列的大小

vector其实是类模板。
其初始化各种方式的具体说明为:

vector<int> v1(10); // 有10个元素 每个值为0
vector<int> v2{10}; // 有1个元素 其值为10
vector<int> v3(10, 1); // 有10个元素 每个值为1
vector<int> v4{10, 1}; // 有2个元素 分别为10和1

在定义vector对象时指定其大小没有必要,且有可能使性能更差。更有效的方法是先定义一个空vector对象,然后在运行时向其添加具体值。

所有标准库容器都可以使用迭代器,但只有少数几种才同时可使用下标运算符。这些类型都拥有名为begin和end的成员
如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器。
迭代器的实质是一个指针。

拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型:

vector<int>::iterator it; // 能读写vector<int>的元素
string::iterator it2; // 能读写string对象的字符
vector<int>::const_iterator it3; // 只能读不能写元素
string::const_iterator it4; // 只能读不能写元素

begin和end返回的具体类型由对象是否常量决定,如果对象是常量,begin和end返回const_iterator,如果对象不是常量,返回iterator。
如果对象只需读操作而无须写操作的话,最后使用const_iterator类型,可使用cbegin和cend函数。其不论对象是否是常量,都返回const_iterator。
但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素
iter1-iter2为两个迭代器相减的结果是它们之间的距离。也就是说,将运算符右侧的迭代器向前移动差值个元素后将得到左侧的迭代器。参与运算的两个迭代器必须指向的是同一个容器中的元素。

在对数组进行操作时,也可使用迭代器进行处理。此时可使用std空间的begin和end函数,来获取数组的首个元素的指针和尾部后一个元素的指针。

int ia[] = {0, 1, 2, 3, 4, 5};
int *beg = begin(ia);
int *last = end(ia);

允许使用数组来初始化vector对象。

int int_arr[] = {0, 1, 2, 3, 4, 5};
vector<int> ivec(begin(int_arr), end(int_arr));

尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。
string类专门提供了一个名为c_str的成员函数。其返回值是一个C风格的字符串。函数的返回值是一个指针,该指针指向一个以空字符结束的字符数组。结果指针的类型是const char*。

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

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

for (const auto &row: ia) // 对于外层数组的每个元素
	for (auto col: row) // 对于内层数组的每个元素
		cout << col << endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值