Функция string.erase не работает в конкретном случае c - PullRequest
0 голосов
/ 01 мая 2020

У меня есть строки следующего формата: «name.bag.csv» Я хотел бы удалить «.bag» из строки. Это пример кода, который я пытаюсь запустить:

csv_file_name = "loololololool.bag.csv";
csv_file_name.erase(csv_file_name.end()-8, 4);
std::cout << csv_file_name << std::endl;

Но я получаю сообщение об ошибке во второй строке:

 no matching function for call to ‘std::__cxx11::basic_string<char>::erase(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >, int)’
         csv_file_name.erase(csv_file_name.end()-8, 4);

Кажется, он принимает только один аргумент. Однако, если я сделаю:

csv_file_name = "loololololool.bag.csv";
csv_file_name.erase(13, 4);
std::cout << csv_file_name << std::endl;

, это, кажется, работает нормально. Также, когда я выполняю

csv_file_name = "loololololool.bag.csv";
csv_file_name.erase(csv_file_name.end()-8);
std::cout << csv_file_name << std::endl;

, он удаляет один символ, как следует. Как это может случиться? csv_file_name.end()-8 должен работать, поскольку он удаляет один символ. И два аргумента должны работать. Но комбинация не? Пожалуйста, помогите!

Ответы [ 3 ]

4 голосов
/ 01 мая 2020

Вы смешиваете итераторы и индексы.

  • string.erase (iter) // удаляет символ, на который указывает итератор

  • string.erase (iter1, iter2) // удаляем символы между двумя итераторами

  • string.erase (index, count) // удаляем счетные символы, начиная с индекса

csv_file_name.end()-8 является итератором, и не существует версии erase, которая бы принимала итератор и индекс или счетчик.

Вместо

csv_file_name.erase(csv_file_name.end()-8, 4);

Я думаю, что вы имели в виду

csv_file_name.erase(csv_file_name.size()-8, 4);

Но на самом деле вы должны быть в состоянии прочитать документацию и выяснить это самостоятельно. Таким образом вы будете намного эффективнее.

0 голосов
/ 01 мая 2020
0 голосов
/ 01 мая 2020

Вы смешиваете особенности std :: string :: erase. Существуют перегрузки, которые работают с одной или двумя целочисленными позициями, и другой набор перегрузок, который работает с одним или двумя итераторами, см. здесь .

Что вы пытаетесь сделать, это вызвать стирание с подпись (итератор, целое число). Эта перегрузка просто не существует.

изменить слишком поздно:)

...