尽管签入C++,但迭代器超出界限
Iterator going outside bounds despite check in C++
>我有一个反转字符串中单词的函数,例如"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);
}
}
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?