17人参与 • 2025-12-02 • C/C++
string迭代器是c++标准模板库(stl)提供的用于遍历和访问string对象中字符的高级工具。它实现了类似指针的概念,但比原始指针更安全、更抽象,提供了更好的封装性和类型安全性。
string提供了多种迭代器类型:
begin()/end():普通迭代器cbegin()/cend():常量迭代器(c++11)rbegin()/rend():反向迭代器crbegin()/crend():常量反向迭代器(c++11)std::string str = "hello, world!";
// 使用迭代器遍历字符串
for(auto it = str.begin(); it != str.end(); ++it) {
std::cout << *it;
}
// 使用反向迭代器
for(auto rit = str.rbegin(); rit != str.rend(); ++rit) {
std::cout << *rit;
}
// 随机访问
auto mid = str.begin() + str.size()/2;
std::cout << "middle character: " << *mid;
由于string数据在内存中的连续性,迭代器操作具有以下性能特点:
string迭代器是c++中处理字符串的强大工具,它结合了指针的高效性和面向对象的安全性,是stl设计哲学的重要体现。
string类提供了多种类型的迭代器,每种都有特定的用途:
这些迭代器都遵循stl的迭代器概念,属于随机访问迭代器类别,支持所有随机访问操作。
string类提供了完备的成员函数来获取不同类型的迭代器:
std::string str = "hello world"; // 获取指向第一个字符的迭代器 auto begin_it = str.begin(); // 获取指向末尾(最后一个字符后一位)的迭代器 auto end_it = str.end(); // 获取反向迭代器 auto rbegin_it = str.rbegin(); // 指向最后一个字符 auto rend_it = str.rend(); // 指向第一个字符前一位 // 常量迭代器版本 auto cbegin_it = str.cbegin(); // 常量开始迭代器 auto cend_it = str.cend(); // 常量结束迭代器 // c++11新增的常量版本 auto crbegin_it = str.crbegin(); // 常量反向开始 auto crend_it = str.crend(); // 常量反向结束
string迭代器支持丰富的操作,这些操作与指针操作类似:
std::string str = "hello";
auto it = str.begin();
*it; // 解引用,获取当前字符'h'
++it; // 移动到下一个字符'e'
--it; // 移动到上一个字符(前提是不在begin位置)
it += 2; // 前进2个字符,从'h'跳到'l'
it -= 1; // 后退1个字符,从'l'回到'e'
it[3]; // 访问当前迭代器位置后第3个字符
// 迭代器比较
auto it1 = str.begin();
auto it2 = str.begin() + 2;
if(it1 < it2) { /*...*/ } // 比较位置
// 计算距离
int dist = it2 - it1; // 结果为2
std::string str = "c++ stl";
// 1. 传统正向遍历
for(auto it = str.begin(); it != str.end(); ++it) {
std::cout << *it;
}
// 2. 反向遍历
for(auto rit = str.rbegin(); rit != str.rend(); ++rit) {
std::cout << *rit; // 输出"lts ++c"
}
// 3. 范围for循环(底层也是使用迭代器)
for(char c : str) {
std::cout << c;
}
// 4. 使用算法遍历
std::for_each(str.begin(), str.end(), [](char c) {
std::cout << c;
});
std::string str = "hello";
// 将每个字符转为大写
for(auto it = str.begin(); it != str.end(); ++it) {
*it = toupper(*it);
}
// 结果: "hello"
// 替换特定位置的字符
auto it = str.begin() + 3;
*it = 'p'; // "helpo"
// 使用迭代器区间构造新字符串
std::string sub_str(str.begin()+1, str.end()-1); // "elp"
std::string str = "programming";
auto it = std::find(str.begin(), str.end(), 'm');
if(it != str.end()) {
std::cout << "found at position: " << (it - str.begin());
// 输出: found at position: 6
}
// 查找所有'm'字符
auto current = str.begin();
while((current = std::find(current, str.end(), 'm')) != str.end()) {
std::cout << "found at: " << (current - str.begin()) << std::endl;
++current;
}
std::string str = "abcde"; std::reverse(str.begin(), str.end()); // 结果: "edcba" // 只反转部分字符串 std::reverse(str.begin()+1, str.end()-1); // "ebcda"
std::string str = "apple,orange,banana";
std::vector<std::string> tokens;
auto start = str.begin();
auto end = std::find(start, str.end(), ',');
while(end != str.end()) {
tokens.emplace_back(start, end);
start = end + 1;
end = std::find(start, str.end(), ',');
}
tokens.emplace_back(start, str.end());
std::string str = "hello"; auto it = str.begin() + 2; // 插入操作可能导致迭代器失效 str.insert(it, 'x'); // 插入后it可能不再有效 // 安全的做法是重新获取迭代器 it = str.begin() + 3; *it = 'y';
// 预分配空间避免多次重新分配
std::string str;
str.reserve(1000); // 预分配1000字节
// 使用迭代器批量插入
std::vector<char> chars = {'a','b','c'};
str.insert(str.end(), chars.begin(), chars.end());
迭代器失效:当字符串进行以下操作时,已有迭代器可能失效:
边界检查:
性能考虑:
与指针的区别:
与c++17 string_view的配合:
std::string str = "hello"; std::string_view sv(str.begin()+1, str.end()-1); // sv为"ell"
string迭代器是stl算法与字符串操作的重要桥梁,熟练掌握它们可以编写出更安全、更高效的字符串处理代码。以下是更详细的说明:
基本概念 string迭代器本质上是指向string容器中字符的智能指针,提供了对字符串元素的安全访问方式。与c风格指针相比,它们具有边界检查能力,能有效防止缓冲区溢出等安全问题。
主要类型
string::iterator和string::const_iteratorstring::reverse_iterator和string::const_reverse_iteratorstd::string s = "hello world"; // 使用std::transform转换大小写 std::transform(s.begin(), s.end(), s.begin(), ::tolower);
(2) 安全遍历字符串
for(auto it = s.begin(); it != s.end(); ++it) {
// 处理每个字符
}
(3) 查找和替换操作
auto pos = std::find(s.begin(), s.end(), 'o');
if(pos != s.end()) {
*pos = '0'; // 安全修改
}
掌握这些技巧可以显著提升字符串处理代码的质量,特别是在处理大型文本或性能敏感场景时。
到此这篇关于c++ stl string迭代器的使用的文章就介绍到这了,更多相关c++ stl string迭代器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论