c++ - 如何在字符串替换后获得有效的迭代器

标签 c++ string replace iterator invalidation

我想在 Windows 下使用迭代器在 C++ 中进行一些字符串替换。 这是代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <iterator>

size_t iterator_to_size_t(std::string &string, std::string::iterator it)
{
    size_t pos;
    pos = std::distance(string.begin(), it);
    return pos;
}


int main()
{
    std::string text = "TTTTbcdefghijklmnopqrstuvwxyz";
    std::string findtext = "TTTT";
    std::string replacementtext = "123456";

    for (std::string::iterator it = text.begin(); it!=text.end(); ++it)
    {
        size_t z = iterator_to_int(text, it);
        if (text.compare(z, findtext.length(), findtext) == 0)
        {
            text.replace(z, findtext.length(), replacementtext);
        }
    }
    return 0;
}

string::replace 方法显然使迭代器无效。我收到一条错误消息。我试图将 string::replace 的返回值分配给迭代器它以获得新的有效迭代器,但返回值似乎不兼容。

我怎样才能在这里得到一个有效的迭代器,或者我必须使用索引而不是迭代器?

最佳答案

您可以在替换后重新计算迭代器,例如

if (text.compare(z, findtext.length(), findtext) == 0)
{
    text.replace(z, findtext.length(), replacementtext);
    it = text.begin() + z + replacementtext.size();
}

此外,有一个使用迭代器的循环,从这些迭代器计算位置索引并使用位置索引取回迭代器真的很麻烦。我建议您考虑以下事项。

#include <regex>

const std::regex re{"TTTT"};
text = std::regex_replace(text, re, replacementtext);

关于c++ - 如何在字符串替换后获得有效的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55741265/

相关文章:

Java String.replaceAll 正则表达式

mysql - 替换 MySQL 查询中的文本?

python - Python 中的字符串操作

C - 拆分字符串

r - 为通过引用替换的 data.tables 编写高效函数

c++ - 如何从 c++ 中的 rosettacode 调用这个 Xiaolin Wu 的线算法

c++ - 在 Excel XLOPER 中通过 char* 返回日语字符

c++ - 如何在游戏中实现碰撞效果?

c++ - 当类包含在另一个类中时,为什么不转发类工作的声明

java - Java 中有等效的 strpbrk 吗?以及如何使用它?