Мне нужно, чтобы получить подстроку с использованием итераторов, а не позиции size_t

0

Я нахожусь в точке моего кода, где у меня есть итераторы для двух местоположений в строке, между которыми мне нужно вернуть подстроку. Я вижу, что функция подстроки (http://www.cplusplus.com/reference/string/string/substr/) занимает только позиции size_t в качестве параметров. Мне пришлось бы многое изменить в моем коде, если бы я вернулся и отслеживал позиции как типы size_t, а не итераторы.

Есть идеи? Я просмотрел все строковые функции (http://www.cplusplus.com/reference/string/string/) и не вижу вопиющих решений.

Чтобы указать некоторый контекст, моя строка

eq

итераторы

FRFP

а также

NLFP

(где eq означает, что моя строка является уравнением, FRFP является первым правым обратным направлением, а NLFP представляет собой следующую левую противоположность). Мне нужна строка, которая находится между FRFP и NLFP, не включительно.

  • 0
    Вы не можете создать новую строку с двумя итераторами?
  • 1
    std::string(it1+1, it2-1) , если итераторы указывают на круглые скобки. Посмотрите на последний конструктор для строки.
Показать ещё 3 комментария
Теги:

2 ответа

2

Предположим, что у вас есть два итератора, указывающих внутри строки. Затем, чтобы извлечь подстроку, вы можете написать

std::string MySubstring( Iterator1, Iterator2 );
  • 0
    Или если символ, на который ссылается второй итератор, должен быть включен в подстроку, тогда std :: string MySubstring (Iterator1, std :: next (Iterator2));
  • 0
    Или после прочтения вашего полного сообщения вы можете написать if (iterator1! = Iterator2) ++ Iterator2; std :: string MySubstring (Iterator1, ++ Iterator2);
0

Два способа сделать это:

#include <iostream>
#include <iterator>

int main()
{
    std::string s = "((hi there))";
    auto lp = s.begin() + 1;
    auto rp = s.end() - 1;

    std::cout << std::string(lp + 1, rp - 1) << "\n";

    int beg_off = std::distance(s.begin(), lp) + 1;
    int end_off = std::distance(lp, rp) - beg_off;

    std::cout << s.substr(beg_off, end_off);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню