1. std::string类
std::string 是 C++ 标准库中的一个类,用于处理字符串。它提供了许多方法来创建、操作和管理字符串,如连接、查找、比较、替换和分割等操作。std::string 类定义在 头文件中。
- std::string 类的基本用法示例:
创建字符串
std::string str1 = "Hello, World!"; // 通过字面量初始化
std::string str2(str1); // 通过另一个 string 对象初始化
std::string str3(10, 'a'); // 创建一个包含 10 个 'a' 的字符串
访问字符串
char firstChar = str1[0]; // 通过索引访问字符
std::cout << str1.c_str() << std::endl; // 将 string 转换为 C 风格字符串并打印
修改字符串
str1 += "!"; // 连接字符串
str1.append(" again!"); // 另一种连接字符串的方法
str1[0] = 'h'; // 修改第一个字符
str1.replace(7, 6, "C++"); // 从索引 7 开始,替换 6 个字符为 "C++"
字符串比较
if (str1 == str2) {
// 如果 str1 等于 str2,执行这里
}
if (str1 < str2) {
// 如果 str1 小于 str2,执行这里
}
查找字符串
size_t pos = str1.find("World"); // 查找 "World" 的位置
if (pos != std::string::npos) {
// 如果找到了,执行这里
}
字符串长度
size_t len = str1.length(); // 获取字符串长度
// 或者
size_t size = str1.size(); // 这与 length() 是等效的
字符串截取
std::string substr = str1.substr(7, 5); // 从索引 7 开始,截取 5 个字符
字符串插入
str1.insert(7, "C++"); // 在索引 7 的位置插入 "C++"
字符串删除
str1.erase(7, 5); // 从索引 7 开始,删除 5 个字符
2. std::vector 类
vector 类是 C++ 标准模板库 (STL) 中的一个非常常用的容器类,它提供了动态数组的功能。vector 容器可以存储同一类型的元素序列,并且可以自动处理元素的存储和内存分配。vector 类提供了很多有用的成员函数,如添加、删除、访问和遍历元素等。
在使用 vector 之前,需要包含相应的头文件:
#include <vector>
2.1 特性
- 动态大小:vector 可以随着元素的添加而自动增长,也可以随着元素的删除而自动缩小。
- 连续存储:vector 中的元素在内存中是连续存储的,因此可以像数组一样通过下标直接访问任意元素,时间复杂度为 O(1)。
- 随机访问迭代器:由于 vector 中的元素是连续存储的,因此可以使用随机访问迭代器来访问元素。
2.2 用法
创建 vector
std::vector<int> vec; // 创建一个空的 int 类型 vector
std::vector<std::string> strVec; // 创建一个空的 string 类型 vector
添加元素
使用 push_back() 函数在末尾添加元素:
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
使用 insert() 函数在指定位置插入元素:cpp
vec.insert(vec.begin() + 1, 4); // 在第二个位置插入 4
访问元素
使用下标运算符 [] 或 at() 函数来访问元素:
int first = vec[0]; // 访问第一个元素
int second = vec.at(1); // 访问第二个元素
删除元素
使用 pop_back() 函数删除末尾元素:
vec.pop_back(); // 删除末尾元素
使用 erase() 函数删除指定位置的元素或元素范围:
vec.erase(vec.begin() + 1); // 删除第二个元素
vec.erase(vec.begin() + 2, vec.end() - 1); // 删除从第三个元素到倒数第二个元素的范围
遍历元素
可以使用迭代器或范围 for 循环来遍历 vector 中的元素:
// 使用迭代器遍历
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << ' ';
}
// 使用范围 for 循环遍历
for (int num : vec) {
std::cout << num << ' ';
}
3. istringstream
std::istringstream 是 C++ 标准库 中的一个类,它提供了一个输入流,用于从字符串中读取数据。std::istringstream 对象可以被用来解析由各种类型数据组成的字符串,如整数、浮点数、字符串等。
Note:已知文件格式的时候使用。
#include <iostream>
#include <sstream>
#include <string>
int main() {
// 创建一个包含多种类型数据的字符串
std::string data = "42 Hello 3.14";
// 创建一个 istringstream 对象并关联到 data 字符串
std::istringstream iss(data);
// 从 iss 中读取整数
int num;
if (iss >> num) {
std::cout << "读取到的整数: " << num << std::endl;
}
// 从 iss 中读取字符串(默认会读取到空格为止)
std::string str;
if (iss >> str) {
std::cout << "读取到的字符串: " << str << std::endl;
}
// 从 iss 中读取浮点数
double dbl;
if (iss >> dbl) {
std::cout << "读取到的浮点数: " << dbl << std::endl;
}
// 如果需要处理剩余的数据,可以使用 getline
std::string remaining;
std::getline(iss, remaining);
std::cout << "剩余的数据: " << remaining << std::endl;
return 0;
}
关键点:
- std::istringstream 对象在构造时关联到一个字符串。
- 使用 >> 运算符从 std::istringstream 对象中读取数据。每次读取都会从当前位置开始,直到遇到空格、换行符或其他分隔符为止(对于字符串类型,默认会读取到空格为止)。
- 如果读取失败(例如,尝试读取整数但当前位置是字母),则 >> 运算符会设置 failbit,并且后续的读取操作将不再执行。你可以使用 clear() 成员函数来重置流的状态。
- 使用 std::getline 可以从 std::istringstream 对象中读取剩余的所有内容,直到遇到换行符或字符串结束为止。注意,std::istringstream 对象中并没有实际的换行符,但 std::getline 仍然可以用来读取剩余的所有数据。
- 你可以通过 str() 成员函数来获取或设置与 std::istringstream 对象关联的字符串。
- std::istringstream 对象在析构时会自动关闭,你不需要显式调用任何关闭函数。