3 字符串向量数组
3.1 命名空间的using声明
- 域操作符 ::
- 安全的使用方法 using
- 头文件不应包含using声明
string s1;
string s2 = s1;
string s3 = "hiya";
string s4(10, 'c');
3.2 string对象的操作
3.2.1 混合使用 >> 和 getline
问题:
int age;
string name;cout << "输入年龄: "; cin >> age;
cout << "输入姓名: "; getline(cin, name); // 会直接跳过! ``` **原因**:`>>` 后换行符留在缓冲区,`getline` 立即读取到空行**解决方案**:```C++
cin >> age;
cin.ignore(); // 清除缓冲区中的换行符
getline(cin, name);
3.2.2 读取文件内容
#include
#includeint main() {
ifstream file("data.txt");
string line;while (getline(file, line)) {
cout << line << endl;
}return 0;
}
3.2.3 使用自定义分隔符
string data = "apple,orange,banana";
string fruit;
istringstream iss(data);while (getline(iss, fruit, ',')) {
cout << fruit << endl;
}
// 输出:
// apple
// orange
// banana
3.2.4string::size_type 的注意事项
- 为什么需要
size_type?
- 标准库为跨平台兼容性设计,
size_type确保能容纳任何可能的字符串大小。 - 实际类型通常是
size_t(无符号整型)。
- 避免与有符号数混用
- 错误示例:
int n = -1;
string s = "Hello";
if (s.size() < n) { // 危险!n 转换为无符号后可能极大
cout << "Unexpected result!"; } ``` - 正确做法: ```C++ auto len = s.size(); // 使用 auto 或显式声明 if (len > 80) { // 安全比较
cout << "Long line: " << s;
}
3.2.5 非法情况:两个字符串字面值直接相加。
string s5 = "Hello" + ", " + s1; // 错误!"Hello" + ", " 无效
3.3 标准库类型vector
- vector是容器也是类模板
- vector不能是引用类型
3.4 迭代器
| 特性 | 说明 |
|---|---|
| 通用性 | 所有标准库容器均支持迭代器,但只有部分支持下标(如 vector、string)。 |
| 安全性 | 解引用前需确保迭代器有效(非 end())。 |
| 类型 | iterator(读写)、const_iterator(只读)。 |
| 失效场景 | 扩容或删除元素后需重新获取迭代器。 |
| 泛型编程 | 使用 != 和 ++ 保证代码对各类容器通用。 |
3.5 数组
(1)指针数组
int* ptrs[10]; // 含 10 个 int* 的数组
(2)数组指针
int (*parray)[3]; // parray 是指向含 3 个 int 的数组的指针
int arr[3] = {1, 2, 3};
parray = &arr; // 指向整个数组
cout << (*parray)[1]; // 输出 2
(3)数组引用
int (&arrRef)[3] = arr; // arrRef 是 arr 的引用
cout << arrRef[0]; // 输出 1