Удалить специальные символы из строки с помощью итераторов

У меня есть довольно простой для вас сегодня, но он определенно поставил меня в тупик на несколько часов. Я предполагаю, что что-то не так с субтитрами моего итератора строк. Я посмотрел в Интернете и даже передал код моему профессору CSE — но что из-за перерыва на день благодарения, у него был только свой телефон и он не мог оказать мне большую помощь.

Надеюсь, кто-то может взглянуть на это и сразу заметить проблему. Как примечание, моя цель — просто удалить специальные символы из строки. Эта строка передается в функцию по ссылке (поэтому возвращаемый тип необязателен). Как дополнительное примечание, я стараюсь сделать это как можно более эффективным. Моим первоначальным замыслом было просто перенести это на вложенные циклы for, но мой CSE prof утверждает, что цикл for с итератором строки внутри более эффективен в некоторых особых случаях, поэтому я должен придерживаться этого. Пожалуйста, дайте мне знать, если кто-нибудь может помочь!

Мне кажется, что проблема должна заключаться в функции удаления, так как удаление принимает const char *, а не просто char *. Я предполагаю, что text.begin () не const и, следовательно, вызывает проблему. Но если я сделаю параметры функции const string &текст, мы, очевидно, не можем изменить текст по ссылке.

Вот код, который у меня есть:

в основном имеем:

 string temp = "~cool~";
XML * parser = new XML();
parser->clearSpecialChars(temp);
cout << temp;

и функция:

void XML::clearSpecialChars(string &text)
{
char chars[]= ".,!()1234567890[]'<>:/{}_|=+;-`~";
for (unsigned int i = 0; i < 33; ++i)
{
text.erase(std::remove(text.begin(),text.end(),chars[i]),text.end());
}
}

однако я получаю ошибку компилятора:

 XML.cpp: In member function ‘void XML::clearSpecialChars(std::string&)’:
XML.cpp:86:69: error: cannot convert ‘std::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >}’
to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’

любые мысли будут с благодарностью!

3

Решение

Есть две функции, называемые remove, Вот описание к каждому из них:

http://www.cplusplus.com/reference/algorithm/remove/

http://www.cplusplus.com/reference/clibrary/cstdio/remove/

3

Другие решения

Твердо закодированная «33» заставляет меня съеживаться. Вы действительно хотели, чтобы ‘\ x00’ был включен в ваш набор специальных символов?

Современный C ++ выгружает циклы в библиотечные процедуры, если это возможно. Здесь другая реализация.

void XML::clearSpecialChars(string &text)
{
const string chars = ".,!()1234567890[]'<>:/{}_|=+;-`~\x00";

auto new_end = std::remove_if(text.begin(), text.end(),
[chars](string::value_type c)
{ return chars.find(c) != string::npos; });
text.erase(new_end, text.end());
}
1

По вопросам рекламы [email protected]