尽管签入C++,但迭代器超出界限

Iterator going outside bounds despite check in C++

本文关键字:迭代器 出界 界限 C++      更新时间:2023-10-16

>我有一个反转字符串中单词的函数,例如"hi thereSam",它将把字符串反转为"Sam there hi"。
它通过反转字符串,然后反转单词来实现这一点。
但是在它完成后,我在 for 的线路上遇到了一个 seg 错误。
我怀疑迭代器试图在有效范围之外取消引用。
但它首先检查范围,所以如果无效,它将立即退出。
我错在哪里?

void rev(string& str) {
std::reverse(str.begin(), str.end());
auto bIter = str.begin();
auto eIter = str.begin();
while (eIter != str.end()) {
for (;eIter != str.end() && (*eIter) != ' '; eIter++) {}
std::reverse(bIter, eIter);
bIter = ++eIter;
}
}

eIter == str.end()在内部 for 循环的末尾时,由于 while 循环的最后一行 (++eIter(,它超出了str.end()

添加break解决了这个问题。

void rev(string& str) {
std::reverse(str.begin(), str.end());
auto bIter = str.begin();
auto eIter = str.begin();
while (eIter != str.end()) {
for (;eIter != str.end() && (*eIter) != ' '; eIter++) {}
std::reverse(bIter, eIter);
if (eIter == str.end()) break; // HERE
bIter = ++eIter;
}
}

你的问题是你的增加eIter即使它是str.end().

由于您已经使用了 std,因此您可以通过std::find来转换循环:

void rev(std::string& str) {
std::reverse(str.begin(), str.end());
for (auto it = str.begin(); it != str.end(); ) {
auto endWordIt = std::find(it, str.end(), ' ');
std::reverse(it, endWordIt);
it = (endWordIt == str.end()) ? str.end() : (endWordIt + 1);
}
}