标准库就是武器库
第三章:字符串、向量和数组
标准库类型:
string
vector
迭代器:它是string和vector的配套类型,常被用于访问string中的字符或vector中的元素。
内置数据类型和其它内置类型一样,数组的实现与硬件密切相关。因此相对于标准库类型的string和vector,数组在灵活性上稍显不足。
std::cin表示从标准输入中读取内容
一档声明using namespace::name,就可以直接访问命名空间中的名字。如:std::cin; std::cout; std::endl;
头文件不应该包含using声明,头文件的内容会拷贝到所有引用它的文件中。可能会产生始料未及的名字冲突。
string的使用:
初始化:
常用一般有4中
string s1;
string s2 = s1; string s2(s1); 拷贝初始化和直接初始化;
string s3 = "hiya"; string s2("hiya");
string s4(10, 'c');
对象上的操作:
os << s
is >> s1
getline(is, s)
s.empty()
s.size()
s[n]
s1+s2
s1=s2
s1==s2
s1!=s2
<,<=,>,>=
string s;
cin >> s; // s对象自动忽略开头的空白(空格符、换行符、制表符)并从第一个真正的字符开始读起,直到遇到下一处空白为止。
getline:读取一行,保留了输入时的空白符,此时需要替代>>,遇到换行符就立马返回函数。也可以返回它的流参数。
string line
// 每次读入一整行,直到文件末尾
while(getline(cin, line))
cout << line << endl;
string::size_type类型是一个无符号类型的值,可存放下任何string对象的大小。而c++11通过auto和decltype来推导变量的类型。若表达式中混用带符号数和无符号数,可能会产生意想不到的结果。如:n是一个具有负值的int,则表达式
s.size() < n 的判断结果几乎肯定是true。因为负值n会自动地转换成一个比较大的无符号值。
对比string对象:大小敏感,按照字典排序,越往后越大
为string对象赋值、两个string对象相加
+两边至少有一个是string类型
处理string对象中的字符:
在名为cname的头文件中定义的名字从属于命名空间std,而定义在名为.h的头文件中的则不然。一般来说,C++程序应该使用名为cname的头文件而不使用name.h的形式,标准库中的名字总能在命名空间std中找到。
处理每个字符?使用基于范围的for语句。
string str("some string");
for(auto c : str)
cout << c << endl;
使用循环for语句改变字符串中的字符,需要把循环变量定义成引用类型,所谓引用只是给定对象的一个别名。
string str("some string");
for(auto &c : str)
c = toupper(c);
只处理一部分字符?
使用小标运算符[]或迭代器。
只要字符串不是常量,就能为下标运算符返回的字符赋新值。
string s("some string");
if (!s.empt())
s[0] = toupper(s[0]);
另一种:
string s = "some string";
for (decltype(s.size()) index = 0;
index != s.size() && !isspace(s[index]); ++index)
{
s[index] = toupper(s[index]);
}
cout << s << endl;
小标的类型为:string::size_type,因为此类型是无符号数,可确保小标不会小于0。此时,代码只需要保证小标小于size()的值就可以了。
例如:编写一个程序把0~15之间的十进制数转化为对应的十六进制形式,只需初始化一个字符串,令其存放16个十六进制“数字”。
无论何时用到字符串的小标,都应该检查其合法性。
标准库中的字符处理函数:
isalnum(c) 当c是alpha或数字时为真
iaalpha(c)
iscntrl(c)
isdigit(c)
isgraph(c) 当c不是空格但可打印时为真
islower(c) 当c是小写字母时为真
isprint(c) 是可打印字符时为真
ispunct(c) 是标点符号是为真
isspace(c) 当c是空白时为真(是空格、横向制表符、纵向制表符、回车符、换行符、进纸符中的一种)
isupper(c)
isxdigit(c) 当c是十六进制数字时为真
tolower(c)
toupper(c)