Как получить действительный итератор после замены строки - PullRequest
1 голос
/ 18 апреля 2019

Я хочу сделать некоторую замену строк в C ++ под Windows, используя итераторы. Это код:

#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 итератору, чтобы получить новый действительный итератор, но возвращаемое значение, по-видимому, несовместимо.

Как мне получить действительный итератор здесь или мне нужно использовать индексы вместо итераторов?

1 Ответ

1 голос
/ 18 апреля 2019

Вы можете пересчитать итератор после замены, например,

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);
...