C++系统学习之二:字符串

  上一篇文章主要学习的是C++的基本类型,它们是C++语言直接定义的,它们体现了计算机硬件本身具备的能力。而本篇文章将主要学习内置类型之外的标准库所定义的类型,分别是string和vector,此外还将学习用来和string与vector配套使用的类型——迭代器,其中string是可变长度的字符序列,而vector则是可变长的给定类型的序列,除此之外还将学习与上述类似的一种内置类型——数组,其也与硬件密切相关。

1. 命名空间的using声明

注意事项:

  • 头文件中的代码一般来说不应该使用using声明

2. 标准库类型string

  所在头文件:string

2.1 定义和初始化string对象

初始化string对象的几种方式

string s1;    默认初始化,s1是一个空串
string s2(s1);  s2是s1的副本
string s2=s1;  等价于s2(s1),s2是s1的副本
string s3("value");  s3是“value”的副本,除了后面的空字符
string s3="value";  等价于s3("value"),s3是“value”的副本
string s4(n,'c');  把s4初始化为连续的n个字符c

直接初始化和拷贝初始化

  如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化

string s5="hiya";    拷贝初始化
string s6("hiya");    直接初始化

2.2 string对象上的操作

 

注意事项:

  •  执行读取操作时,string对象会自动忽略开头的空白,并从第一个真正的字符开始读起,直到下一个空白处
  • getline()读取整行会保留一行中的空白符,直到碰到换行符,但最终读到的数据不保留换行符号
  • size()函数不要和int型的数据一起在表达式中使用,因为size()的返回类型是unsigned类型 
  • string的比较操作对大小写敏感,比较的时候,如果字符都相同则比较长短,否则比较第一个不相同的字符的字典顺序
  • string和字面值的相加时要注意,加号两边必须要有一个string对象,不能全是字面值

2.3 处理string对象中的字符

  在头文件cctype中定义了一组函数

 

 使用基于范围的for循环遍历字符串的每个字符

string s = "hello world!";
for (auto c : s)
{
    cout << c << endl;
}

如果需要修改字符串中的字符,则需要将循环控制变量定义为引用

string s = "hello world!";
for (auto &c : s)
{
    c = toupper(c);
}
cout << s << endl;

NOTE:使用下标(索引)来访问字符串的某个字符时,一定要注意下标不能超出范围,这个时候我们一般使用decltype(s.size())来定义下标变量,这样就不会出现小于0的情况,只要控制小于size()即可。

for(decltype(s.size()) index=0; index!=s.size() && !isspace(s[index]); ++index)
{
     s[index] = toupper(s[index]);  
}

 

posted @ 2018-08-06 17:46  jameshater  阅读(248)  评论(0编辑  收藏  举报