第一个问题,如何使用在命名空间std中的库
之前很麻烦的在每个函数前加上std::
std::string str = '';
std::cin >> i;
std::cout << b << std::endl;
一种方便得到方法是使用using声明: using namespace::name;
这样每个using声明引入命名空间中的一个成员
注意:头文件中一般不应该使用using声明,会造成名字冲突。
标准库类型string
首先别忘了包含头文件string。
#include <string>
using std::string;
前面提到默认初始化string对象,是一个空串。
特别的有,提供数字和字符,进行重复 string str(10,'c');
表示定义一个string类型的str,初始化为“cccccccccc”.
初始化方式的不同:
1.使用等号,初始化一个变量,是拷贝初始化,编译器把等号右边的初始值拷贝到新创建的对象中。
2.不使用等号,就是直接初始化。
当初始值只有一个,使用直接初始化和拷贝初始化都可以
初始化的值有多个,最好用直接初始化(拷贝初始化可读性差)
例子:string str = string(10, 'c');
其中需要显式创建一个临时string对象进行拷贝,
string temp(10, 'c');
string str = temp;
string的操作
getline(is , s ) 从is中读取一行赋给s,返回is
s.empty() 判断s是否为空串
s.size() 返回s中字符的个数(不包括’\0’)
s1+s2 返回字符串连接后的结果
s1 == s2 判断两个字符串的字符完全相同
比较运算符 利用字符在字典中的顺序进行比较
在执行读取操作时,string对象会自动忽略开头的空白(空格、换行、制表符等)从第一个真正的字符开始读,直到遇到下一处空白。
怎么样保留空白呢?还记得前面的getline(s1, s2)吗
1.getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符(这里换行符也被读取)
2.然后把读入的内容存到string对象中(不存换行符)
getline函数一遇到换行符就结束操作并返回结果。
如果一开始遇到换行符,返回一个空的string串。
s.size()函数返回一个string::size_type类型的值(体现了标准库类型与机器无关的特性)
目前来看,string::size_type类型是一个无符号类型的值,而且能存放下任意string对象的大小。
如果一条表达式中有size()函数就不再使用int,混用带符号和无符号,带来隐式转换的问题。
string对象相等意味着他们的长度相同而且包含的字符也全都相同。
字面值与string对象相加
当把string对象和字符字面值及字符串字面值在一条语句中使用,确保每个加法运算符两侧的运算对象至少有一个是string
string s = s1 + ' ' + 'hello';
范围for 语句
for(declaration : expression)
statement;
其中 expression部分是一个对象,用于表示一个序列
declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素
每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素
例子:使用范围for语句把string对象中的字符每行一个输出出来(相当于遍历字符串)
string str("some string");
for(auto c : str)
cout << c << endl;
使用范围for 语句改变字符串中的字符
如果想要改变string对象的字符的值,必须把循环变量定义为引用类型
这里引用只是给定对象的一个别名,因此当使用引用作为循环控制变量时,这个变量实际上被依次绑定到了序列的每一个元素上,使用这个引用,可以改变绑定的字符。
string str("some string");
for(auto &c : s)
c = toupper(c); //c是个引用,赋值语句将改变s中字符的值
cout << s << endl;
每次迭代时,变量c引用string对象s的下一个字符,赋值给c也就是在改变s中对应字符的值。
访问string对象中的单个字符:
1.使用下标
2.使用迭代器
下标运算符[?] 接收的参数是string::size_type 类型的值,这个参数表示要访问的字符的位置,返回值是该位置字符的引用。
string对象的下标大于等于0小于s.szie()
如果某个下标是带符号类型的值就会自动转换为由string:;size_type类型表达的无符号类型。