第三章 字符串、向量和数组
3.1 命名空间的using声明
①
这种方式可以只声明std中的cin,即不需要包含整个std命名空间
using std :: cin;
②
这种方式是把std整个命名空间都包含进去
using namespace std;
③
注意在头文件中,不应该包含using声明。因为头文件的内容会被拷贝到每一个引用他的文件中,那么using声明也会被拷贝过去,这样可能会不经意间产生错误。
3.2 标准库类型string
3.2.1 定义和初始化 string 对象
void initString(){
string s1; //string类默认初始化为空串
//下面这行代码还可以写成 string s2(s1);
string s2 = s1; //s2是s1的拷贝
//下面这行代码还可以写成 string s3("hello");
string s3 = "hello"; //注意,这里是把hello拷贝到s3中,字面值的'\0'并不拷贝
string s4(10,'w'); //s4的值是10个w,这里的初始化方法就是初始化num个c
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
}
直接初始化和拷贝初始化
如果用等号初始化一个变量,实际上执行的是拷贝初始化。
string s5 = "hello"; //拷贝初始化
string s6("hello"); //直接初始化
3.2.2 string对象上的操作
//本例书上代码但是暂时不知道is是什么输入流
//'is' was not declared in this scope
//从is中读取字符串赋给s,返回is
is >> s;
//把s写入输出流os中,返回os
os << s;
注意利用cin进行读入的时候,开头的空白会被自动忽略。而读入的时候,遇到空白也会停止
例如读入的是 ***" Hello World "***,输出的是 ***“Hello”***。
void methods_1(){
string s,s1,s2;
//从cin中获取一行赋值给s,返回cin。下面会提到这种方式和cin直接读取的不同
getline(cin,s);
if(!s.empty()){ //为空返回true,否则返回false
cout << s << endl;
cout << s.size() << endl; //返回s中字符的个数
cout << s[0] << endl; //返回s中第n个字符的引用,注意是引用,意味着可以这样来实现修改
}
cin >> s1;
if(!s1.empty()){
cout << s + s1 << endl; //返回s和s1连接后的结果
s2 = s; //理由s的副本来改变s2的值
if(s2 == s){ //判断两个字符串是否相等,不等判断使用 !=
cout << "s2 equal s" << endl;
}
}
if(s > s1){ //字符串的比较是基于ASCII,一个字符一个字符比较的
cout << "s > s1" << endl;
} else if(s >= s2){
cout << "s >= s2" << endl;
}
}
***如果想保留输入时的空格,用getline()***。
getline() 遇到换行符的时候结束当前读入。注意换行符也被读进来了。但是把读到的内容存到string对象时,并不存换行符。
//getline函数和cin不同,cin遇到空白就停,getline读取一行,直到遇到换行符
void method_getline(){
string line;
int count = 0;
while(getline(cin,line)){
count++;
cout << line << endl;
if(count >= 2)
break;
}
cout << "下面是用cin输入,比较差别" << endl;
while(cin >> line){
cout << line << endl;
}
}
string :: size_type
这里有个要注意的点,string::size_type是一个***无符号类型***的值。定义这样的类型主要是为了体现标准库类型与机器无关的特性。
当进行如下比较的时候,可能会产生错误,但是这又是我们非常容易忽略的。