1. string 和 vector 是两种最重要的标准库类型,前者支持可变长字符串,后者则表示可变长的集合,还有一种标准库类型是迭代器,它是 string 和 vector 的配套类型,常被用于访问 string 中的字符或 vector 中的元素
2. std::cin 的意思是要使用命名空间 std 中的名字 cin,用到的每个名字都必须有自己的声明语句,而且每句话都得以分号结束
3. 头文件不应该包含 using 声明
4. cin、cout、end、istream、ostream、string 都是 std 命名空间里的7
5. 使用 string 类型必须首先包含 string 头文件,string 定义在命名空间 std 中
6. 如何初始化类的对象是由类本身决定的,多种初始化方式之间应该有所不同
7. 初始化 string 对象常用的一些方式:
string s1; //默认初始化,s1 是一个空字符串,该 string 对象中没有任何字符
string s2(s1); s2 是 s1 的副本
string s2 = s1; //s2 是 s1 的副本,等价于 s2(s1)
string s3("value"); //s3 是字面值 value 的副本,除了字面值最后的那个空字符外
string s3 = "value"; //等价于s3("value"),s3 是该字符串字面值的副本,没有最后那个空字符,其他字符都被拷贝到新创建的 string 对象中
string s4(n,'c'); //把 s4 初始化为由连续 n 个字符 c 组成的串
string s4(10,'c');//s4 的内容是 cccccccccc
8. = 等号拷贝初始化,反之则直接初始化int
9, 初始化的值有多个时,只能使用直接初始化
10. 类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作
11. 可以使用标准库中的 iostream 来读写 int、double 等内置类型的值,也可以使用 IO 操作符读写 string 对象,string 对象会忽略开头的空白(即空格符、换行符、制表符等),并从第一个真正的字符开始读起,直到遇到下一处空白为止
#include <iostream>
#include "Sales_item.h"
using namespace std;
int main()
{
string word;
while (cin >> word) //读取未知数量的 string 对象
{
cout << word << endl;
}
return 0;
}
12. getline() 函数只要一遇到换行符就结束读取操作并返回结果,把所读的内容存入那个 string 对象中,换行符也被读进来了,但后面被丢弃了,得到的 string 对象中没有换行符
#include <iostream>
#include "Sales_item.h"
using namespace std;
int main()
{
string line;
while (getline(cin, line))
{
cout << line << endl;
}
return 0;
}
13. s.empty(),s 为空返回 true,否则返回 false,size() 函数返回 string 对象的长度(即 string 对象中字符的个数)
14. 所有用于存放 string 类型的 size 函数返回值的变量,都应该是 string ::size_type 类型的,其是无符号整型数,表达式混用带符号数和无符号数会产生意想不到效果,例如:假设 n 是一个负值的 int,则表达式 s.size() < n 的判断结果几乎是 true,这是因为负数 n 会自动转换成一个比较大的无符号值,一条表达式已经有了 size() 函数就不要使用 int 了,这样可以避免混用 int 和 unsigned 可能带来的问题
15. 比较 string 对象,这些比较运算符逐一比较 string 对象中的字符,并且对大小写敏感,同一字母的大小写是不同的,string 对象相等意味着它们的长度相同而且所包含的字符也全都相同,一对一对来比。允许把一个对象的值赋给另外一个对象
16. 两个 string 对象相加,是将两部分串接而成,将右侧的 string 对象加到左侧后面,+ 的两侧的运算对象至少有一个是 string,相加的结果为 string,不能把字面值直接相加,C++ 语言中的字符串字面值与 string 是不同的对象
17. cctype 头文件中定义了一些对字符处理判断的函数。例如 isalnum(c) 当c是字母或数字时为真
18. C++ 程序使用名为 cname 的头文件而不使用 name.h 的形式,标准库中的名字总能在命名空间中 std 中找到
19. 范围 for 语句:
//遍历 str 对象中的每个字符
for(char c: str对象)
{
}
//举例
string str("some string");
for(auto c: str)
{
}
20. 要改变 string 对象中字符的值,必须把循环变量定义成引用类型,依次绑定到序列的每个元素上,如果不用引用,相当于用拷贝复制副本,不能修改原 string 对象中字符的值
string s("HelloWorld!!!");
for (auto &c : s)
{
c = toupper(c);
}
cout << s << endl;
21. 要访问 string 对象中的单个字符有两种方式:一种是使用下标,另外一种是使用迭代器,下标运算符【】接受的输入参数是 string::size_type 类型的值,这个参数表示要访问的字符位置,返回值是该位置上字符的引用,string 对象的下标从 0 计起,类似数组,s[s.size() - 1] 是最后一个字符,索引必须为整型值,只要 string 对象使用了下标,都要确定在那个位置确实有值
if (!s.empty()) //确保确实有字符需要输出
{
cout << s[0] << endl;
}
22. 字符串常量与字符串变量,只要字符串不是常量,就能为下标运算符返回的字符赋新值
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1 = "abc";//字符串变量
char* s2 = "abc";//字符串常量,先在常量区存储"abc",s2直接指向常量区的"abc"
char s3[] = "abc";//字符数组,先在常量区存储"abc",然后在栈区申请内存空间,将"abc"复制过来,s3指向栈区的"abc"
// s1[0] = 'q';//正确,
// s2[0] = 'q';//错误,s2所指向内容是常量,不能修改
// s3[0] = 'q';//正确
// s1 = "abcd";//正确
// s2 = "abcd";//正确,s2指向另外一个字符串常量
// s3 = "abcd";//错误,s3是数组名,相当于指针常量,指向不能改变
cout << s1 << s2 << s3 << endl;
return 0;
}
23.使用下标执行随机访问
#include <iostream>
#include <string>
using namespace std;
int main()
{
const string hexdigits = "0123456789ABCDEF";
cout << "Enter a series of numbers between 0 and 15"
<< " separated by spaces. Hit ENTER when finished: "
<< endl;
string result;
decltype(result.size()) n;
while (cin >> n)
{
if (n < hexdigits.size())
{
result += hexdigits[n];
}
}
cout << "Your hex number is:" << result << endl;
return 0;
}