C++中 string 类及迭代器相关知识详解
目录
一、 string 类的基本使用
1. 字符串的定义和初始化
2. 遍历字符串
下标访问方式
迭代器访问方式
正向迭代器:
反向迭代器:
范围 for 循环方式
二、 string 类的成员函数
1. 容量相关函数
2. 扩容机制
三、迭代器与容器的配合
1. vector 容器的迭代器使用
2. list 容器的迭代器使用
四、实际应用案例:字符串数字相加
一、 string 类的基本使用
在C++ 中, string 类是用于处理字符串的强大工具。它包含在 <string> 头文件中。下面是一些基本的使用示例:
1. 字符串的定义和初始化
cpp
#include <iostream>
#include <string>
int main() {
std::string s0; // 定义一个空字符串
std::string s1("hello world"); // 使用字符串字面量初始化
std::cout << s1 << std::endl;
return 0;
}
在上述代码中,我们定义了一个空字符串 s0 和一个初始化为"hello world"的字符串 s1 ,并将 s1 输出到控制台。
2. 遍历字符串
下标访问方式
cpp
#include <iostream>
#include <string>
int main() {
std::string s1("hello world");
for (size_t i = 0; i < s1.size(); i++) {
std::cout << s1[i];
}
std::cout << std::endl;
return 0;
}
通过 size() 函数,length也行,但不推荐获取字符串长度,利用下标 [] 操作符遍历字符串中的每个字符并输出。
迭代器访问方式(类似于指针,但不完全是)
正向迭代器:
cpp
#include <iostream>
#include <string>
int main() {
std::string s1("hello world");
std::string::iterator it = s1.begin();
while (it != s1.end()) {
std::cout << *it << " ";
++it;
}
std::cout << std::endl;
return 0;
}
这里使用 begin() 函数获取指向字符串开头的迭代器, end() 函数获取指向字符串末尾(实际是末尾元素的下一个位置)的迭代器,通过迭代器遍历并输出字符。
反向迭代器:
cpp
#include <iostream>
#include <string>
int main() {
std::string s1("hello world");
std::string::reverse_iterator rit = s1.rbegin();
while (rit != s1.rend()) {
std::cout << *rit << " ";
++rit;
}
std::cout << std::endl;
return 0;
}
rbegin() 函数获取指向字符串末尾的反向迭代器, rend() 函数获取指向字符串开头(实际是开头元素的前一个位置)的反向迭代器,实现反向遍历。
范围 for 循环方式
cpp
#include <iostream>
#include <string>
int main() {
std::string s1("hello world");
for (auto ch : s1) {
std::cout << ch << " ";
}
std::cout << std::endl;
return 0;
}
范围 for 循环会自动遍历字符串中的每个字符,代码简洁明了。
二、 string 类的成员函数
1. 容量相关函数
- size() 和 length() :这两个函数功能相同,都用于返回字符串中有效字符的个数。
- capacity() (借鉴数据结构):返回当前字符串在重新分配内存之前能够存储的字符数。
- max_size()(不稳定,取决于编译器) :返回字符串能够容纳的最大字符数。
示例代码:
cpp
#include <iostream>
#include <string>
int main() {
std::string s1("hello world");
std::cout << "size: " << s1.size() << std::endl;
std::cout << "length: " << s1.length() << std::endl;
std::cout << "capacity: " << s1.capacity() << std::endl;
std::cout << "max_size: " << s1.max_size() << std::endl;
return 0;
}
2. 扩容机制
当向字符串中添加元素导致当前容量不足时, string 类会自动扩容。以下是演示 string 扩容过程的代码:
cpp
#include <iostream>
#include <string>
int main() {
std::string s1;
size_t old = s1.capacity();
for (size_t i = 0; i < 100; i++) {
s1 += 'x';
if (old != s1.capacity()) {
std::cout << "扩容: " << s1.capacity() << std::endl;
old = s1.capacity();
}
}
return 0;
}
在这个示例中,每次向字符串 s1 添加一个字符 'x' ,如果容量发生变化,就输出新的容量值。通常 string 的扩容策略是按照一定倍数(常见为1.5倍或2倍)增加容量。
不同编辑器有所不同:
三、迭代器与容器的配合(只做示范,后期具体会分析)
在C++ 中,迭代器不仅用于 string 类,还广泛应用于其他容器,如 vector 、 list 等,并且使用方式类似。
1. vector 容器的迭代器使用
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
std::vector<int>::iterator vit = v.begin();
while (vit != v.end()) {
std::cout << *vit << " ";
++vit;
}
std::cout << std::endl;
return 0;
}
这里创建了一个 vector 容器并插入一些元素,通过迭代器遍历并输出容器中的元素。
2. list 容器的迭代器使用
cpp
#include <iostream>
#include <list>
int main() {
std::list<int> lt;
lt.push_back(10);
lt.push_back(20);
lt.push_back(3);
std::list<int>::iterator lit = lt.begin();
while (lit != lt.end()) {
std::cout << *lit << " ";
++lit;
}
std::cout << std::endl;
return 0;
}
对于 list 容器,同样使用迭代器来遍历其中的元素。
此外,还可以使用标准算法结合迭代器对容器进行操作,例如:
cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {4, 2, 3, 1};
std::reverse(v.begin(), v.end()); // 反转vector
for (auto e : v) {
std::cout << e << " ";
}
std::cout << std::endl;
std::sort(v.begin(), v.end()); // 排序vector
for (auto e : v) {
std::cout << e << " ";
}
std::cout << std::endl;
return 0;
}
reverse 算法用于反转容器中的元素顺序, sort 算法用于对容器中的元素进行排序,它们都通过迭代器指定操作的范围。
四、实际应用案例:字符串数字相加(下期详解)
假设有两个用字符串表示的数字,需要将它们相加并以字符串形式返回结果。以下是实现代码:
cpp
#include <iostream>
#include <string>
std::string addStrings(std::string num1, std::string num2) {
int end1 = num1.size() - 1, end2 = num2.size() - 1;
std::string strRet;
int carry = 0;
while (end1 >= 0 || end2 >= 0) {
int val1 = end1 >= 0? num1[end1] - '0' : 0;
int val2 = end2 >= 0? num2[end2] - '0' : 0;
int ret = val1 + val2 + carry;
carry = ret / 10;
ret = ret % 10;
strRet += ('0' + ret);
--end1;
--end2;
}
if (carry > 0) {
strRet += ('0' + carry);
}
std::reverse(strRet.begin(), strRet.end());
return strRet;
}
在这个函数中,我们从两个字符串数字的末尾开始逐位相加,处理进位情况,最后将结果字符串反转得到正确的顺序。
通过对 string 类和迭代器的深入学习与实践,可以更好地处理字符串相关操作以及对容器进行遍历和算法操作,提高C++ 编程的效率和能力。