文章目录
string类对象的常见构造string类对象的容量操作size() / length():返回字符串的长度(字符数)。capacity():返回当前字符串分配的容量(即在重新分配内存前可以保存的字符数)。检查是否为空:使用 empty() 函数检查字符串是否为空。clear():清空字符串,使其变为空字符串。reserve(size_t n):预留至少 n 个字符的空间,避免后续频繁分配内存。resize(size_t n):调整字符串的大小。可以增大或缩小字符串的长度。 string类对象的访问及遍历操作operator[]:使用索引访问或修改字符串中的某个字符(不进行边界检查)迭代器 string类对象的修改操作push_back():在字符串末尾添加一个字符。append():将指定的字符串或字符追加到当前字符串的末尾。operator += 同append()类似,不过更加简洁c_str()find():查找子串在字符串中的位置,返回起始位置索引,若未找到返回string::npos。rfind 返过来的find()substr(Generate substring) string类非成员函数1. operator>> —— 输入运算符2. operator<< —— 输出运算符std::getline() 函数
前言:string 是 C++ 标准库中的一个类,专门用于处理和操作字符串。与 C 语言中的字符数组(char[])相比,string 提供了更丰富的功能和更安全的内存管理,极大地简化了字符串操作。
在string当中其含有许多的接口,我们通过这些接口去使用这些让我们写代码更加方便的函数,更加高效的完成我们想要实现的目标,所以我们需要了解部分的接口,让我们在进行结果的实现更加轻松,但是由于接口过多,所以我只需要知道关于string中重点,常用的即可
string类对象的常见构造
可以清楚的看到,在string构造当中含有许多的接口,这边我们重点了解的是
string() | 构造空的string类对象,即空字符串 |
---|---|
string(const char* s) | 用C-string来构造string类对象 |
string(const string&s) | 拷贝构造函数 |
void Teststring() { string s1; // 构造空的string类对象s1 string s2("hello bit"); // 用C格式字符串构造string类对象s2 string s3(s2); // 拷贝构造s3 }
string类对象的容量操作
size | 返回字符串有效长度 |
---|---|
length | 返回字符串有效长度 |
capacity | 返回空间总大小 |
empty | 检测字符串释放为空串,是返回true,否则返回false |
clear | 清空有效字符 |
reserve | 为字符串预留空间 |
resize | 将有效字符的个数该成n个,多出的空间用字符c填充 |
size() / length():返回字符串的长度(字符数)。
string str = "Hello";cout << str.size(); // 输出 5cout << str.length(); // 等同于 size()
capacity():返回当前字符串分配的容量(即在重新分配内存前可以保存的字符数)。
string str = "Hello";cout << str.capacity(); // 输出当前分配的容量
检查是否为空:使用 empty() 函数检查字符串是否为空。
if (str.empty()) { cout << "String is empty" << endl;}
clear():清空字符串,使其变为空字符串。
string str = "Hello";str.clear(); // 结果为空字符串 ""
reserve(size_t n):预留至少 n 个字符的空间,避免后续频繁分配内存。
string str = "Hello";str.reserve(100); // 预留至少 100 个字符的空间
resize(size_t n):调整字符串的大小。可以增大或缩小字符串的长度。
string str = "Hello";str.resize(10, 'x'); // 变为 "Helloxxxxx"
string类对象的访问及遍历操作
operator[] | 返回pos位置的字符,const string类对象调用 |
---|---|
begin+end | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
rbegin+ rend | begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器 |
at() | 相比operator[]更加安全带边界检查 |
operator[]:使用索引访问或修改字符串中的某个字符(不进行边界检查)
string str = "Hello";char c = str[1]; // 访问第二个字符,'e'str[0] = 'h'; // 修改第一个字符
迭代器
string 提供了迭代器来遍历字符串:
begin() 和 end() 返回指向字符串起始和末尾的迭代器。
rbegin() 和 rend() 返回逆向迭代器,用于逆序遍历。
// 迭代器string::iterator it = s.begin();while (it != s.end()){cout << *it << endl;++it;}// string::reverse_iterator rit = s.rbegin();// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型auto rit = s.rbegin();while (rit != s.rend())cout << *rit << endl;// 3.范围forfor (auto ch : s)cout << ch << endl;}
string类对象的修改操作
push_back | 在字符串后尾插字符 |
---|---|
append | 在字符串后追加一个字符串 |
operator+= | 在字符串后追加字符串str |
c_str | 返回C格式字符串 |
find + npos | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
substr | 在str中从pos位置开始,截取n个字符,然后将其返回 |
push_back():在字符串末尾添加一个字符。
string str = "Hello";str.push_back('!');//输出: Hello!
append():将指定的字符串或字符追加到当前字符串的末尾。
//追加一个对象string str1 = "Hello";string str2 = " World";str1.append(str2); // 结果: "Hello World"//追加多个副本string str = "Hello";str.append(3, '!'); // 结果: "Hello!!!"
operator += 同append()类似,不过更加简洁
string str1 = "Hello";string str2 = " World";str1 += str2; // 结果: "Hello World"string str = "Hello";str += '!'; // 结果: "Hello!"
c_str()
#include <iostream>#include <string>#include <cstdio> // 用于 printfint main() { // 创建 std::string 对象 std::string str = "Hello, C++"; // 使用 c_str() 获取 C 风格字符串 const char* cstr = str.c_str(); // 打印 C 风格字符串 std::printf("C-style string: %s\n", cstr); // 与 C 风格字符串进行交互(不能修改内容) if (std::strcmp(cstr, "Hello, C++") == 0) { std::cout << "Strings are equal!" << std::endl; } return 0;}输出:C-style string: Hello, C++Strings are equal!
find():查找子串在字符串中的位置,返回起始位置索引,若未找到返回string::npos。
string str = "Hello, World!";size_t pos = str.find("World"); // 返回 7
rfind 返过来的find()
str:要查找的子字符串(可以是 std::string、const char* 或字符 char)。
pos:从字符串的右侧开始查找的起始位置,默认值是 npos,表示从字符串末尾开始查找。
n:要查找的字符数(当使用 const char* 时适用)。
int main (){ string str ("The sixth sick sheik's sixth sheep's sick."); string key ("sixth"); size_t found = str.rfind(key); if (found!=std::string::npos) str.replace (found,key.length(),"seventh"); cout << str << '\n'; return 0;}输出:The sixth sick sheik's seventh sheep's sick.
substr(Generate substring)
int main (){ string str="We think in generalities, but we live in details."// (quoting Alfred N. Whitehead) string str2 = str.substr (3,5); // "think" size_t pos = str.find("live"); // position of "live" in str string str3 = str.substr (pos); // get from "live" to the end cout << str2 << ' ' << str3 << '\n'; return 0;}输出:think live in details.
string类非成员函数
operator+ | 尽量少用,因为传值返回,导致深拷贝效率低 |
---|---|
operator>> | 输入运算符重载 |
operator<< | 输出运算符重载 |
geline | 获取一行字符串 |
realtional operator | 大小比较 |
1. operator>> —— 输入运算符
operator>> 用于从输入流中提取数据。它将输入流中的数据读取到变量中,并根据变量的类型自动进行解析。
常见用法:
用 std::cin 从控制台输入数据。
可以用于基本数据类型(如 int、float、char 等)和字符串(std::string)的输入。
#include <iostream>#include <string>int main() { int num; std::string name; // 输入整数 std::cout << "Enter a number: "; std::cin >> num; // 输入字符串(单词) std::cout << "Enter your name: "; std::cin >> name; std::cout << "Number: " << num << ", Name: " << name << std::endl; return 0;}输出:Enter a number: 42Enter your name: JohnNumber: 42, Name: John
2. operator<< —— 输出运算符
operator<< 用于将数据输出到输出流中,通常与 std::cout 一起使用,用来将数据输出到控制台。它可以输出基本数据类型、字符串和用户自定义类型。
常见用法:
用 std::cout 将数据输出到控制台。
支持链式调用,可以连续输出多个数据。
#include <iostream>#include <string>int main() { int age = 25; std::string name = "Alice"; // 输出数据 std::cout << "Name: " << name << ", Age: " << age << std::endl; return 0;}输出:Name: Alice, Age: 25
std::getline() 函数
在 C++ 中,std::getline() 是一个用于从输入流中读取整行文本的函数。与 operator>> 不同,std::getline() 会读取包括空格在内的整行输入,直到遇到换行符 \n。它适用于需要获取用户输入的完整行内容的场景。
示例 1:读取一行文本
#include <iostream>#include <string>int main() { std::string input; std::cout << "Enter a line of text: "; // 读取整行输入,直到遇到换行符 std::getline(std::cin, input); std::cout << "You entered: " << input << std::endl; return 0;}
Enter a line of text: Hello, World!You entered: Hello, World!
示例 2:自定义分隔符
#include <iostream>#include <string>int main() { std::string input; std::cout << "Enter text (semicolon ';' to end): "; // 读取输入,直到遇到分号 std::getline(std::cin, input, ';'); std::cout << "You entered: " << input << std::endl; return 0;}
Enter text (semicolon ';' to end): This is a test; Some more textYou entered: This is a test
std::string 是 C++ 标准库中的字符串类,它提供了对字符串操作的丰富接口和功能,极大地简化了对文本数据的处理。std::string 是面向对象的,并且支持动态内存管理,这使得它比 C 风格的字符数组(char[])更加灵活和安全。