本章讲解:内置数组;string支持可变长度的字符串;vector可变长度的集合。还有与string或vector配套使用的迭代器。
1.命名空间的using声明
比如使用标准库中cout语句,需要使用::操作符:编译器从操作符左侧名字所示的作用域中寻找右侧那个名字。
std::cout << "hello world";
std::cout << "hello china";
1.1 每个名字都需要独立的using声明
如上代码格式,每条使用标准库的语句都需要使用std::,而使用了using语句后,在文件中只需要声明一次。
#inlcude <iostream>
using std::cout;
using std::cin;
using std::endl;
int main(){
cout << "hello world" << endl;
cout << "hello china" << endl;
return 0;
}
1.2头文件不应包含using声明
头文件中的代码一般来说不应该使用using声明。因为在编译的时候,头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明。对于某些程序而言,由于不经意包含了一些名字,反而可能因为头文件包含using,造成产生始料未及的名字冲突。
2.标准库类型string
标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件。作为标准库的一部分,string定义在命名空间std中。使用string类型,代码中必须包含:
#include <string>
using std::string;
2.1定义和初始化string对象
string定义了多种初始化对象的方式:
string s1; // 默认初始化,s1是一个空字符串。没有字符,只有一个末尾的空字符
string s2 = s1; // s2是s1的副本
string s22(s1); // s22是s1的副本
string s3 = "hiya"; // s3是该字符串字面值的副本
string s33("hiya"); // s33是该字符串字面值的副本
string s4(10, 'c'); // 把s4初始化为由连续10个字符c组成的字符串
-
直接初始化和拷贝初始化
如果使用等号=初始化一个变量,实际上执行的是拷贝初始化(copy initialization),编译器是把等号右边的初始值拷贝到新建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化(direct initialization)。
string s5 = "hello"; // 拷贝初始化;
string s6("hiya"); // 直接初始化;
string s7(10, 'c'); // 直接初始化,s7的内容是cccccccccc
对于字符串的拷贝初始化和直接初始化可以结合使用:
string s8 = string(10, 'c');
上面代码执行的经过是:先直接初始化,用使用数字10和字符c两个参数创建出一个string对象,然后这个对象拷贝给s8,对s8完成拷贝初始化,相当于如下两条语句:
string temp(10, 'c');
string s8 = temp;
2.2.string对象上的操作
-
读写string对象
和int、double等内置类型一样,可以使用标准库中的iostream来读写。
int main(){
string s; // 空字符串
cin >> s; // 将string对象读入s,从第一个真正字符开始,遇到空白字符停止
cout << s << endl; // 输出s
return 0;
}
和其它内置基本数据类型一样,可以多个输入输出连写使用:
string s1, s2;
cin >> s1 >> s2;
cout << s1 << s2 << endl;
-
读取未知数量的string对象
-
使用getline读取一整行
-
string的empty和size操作
-
string::size_type类型
-
比较string对象
-
为string对象赋值
-
两个string对象相加
-
字面值和string对象相加
-
2.3处理string对象中的字符