第3章 字符串向量数组

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 立即读取到空行

解决方案

cin >> age;
cin.ignore(); // 清除缓冲区中的换行符
getline(cin, name);

3.2.2 读取文件内容

#include <fstream>
#include <string>

int 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 的注意事项

  1. 为什么需要 size_type

    • 标准库为跨平台兼容性设计,size_type 确保能容纳任何可能的字符串大小。

    • 实际类型通常是 size_t(无符号整型)。

  2. 避免与有符号数混用

    • 错误示例:

      int n = -1;
      string s = "Hello";
      if (s.size() < n) {  // 危险!n 转换为无符号后可能极大
          cout << "Unexpected result!";
      }
    • 正确做法:

      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 迭代器

特性 说明
通用性 所有标准库容器均支持迭代器,但只有部分支持下标(如 vectorstring)。
安全性 解引用前需确保迭代器有效(非 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

发表评论