Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
elektron5
Заблокирован
#1

Ошибка при вызове wstring.erase - C++

12.08.2014, 13:50. Просмотров 340. Ответов 7
Метки нет (Все метки)

форум глючит ...

Добавлено через 1 минуту
Почему erase ругается ?

C++
1
2
3
4
5
6
std::wstring testString = L"SHAKE YOUR TITS (. )^( .)";
for (auto it = testString.rbegin(); it != testString.rend(); it--)
{
    if (*it == L'^')
        testString.erase(it, testString.end()); 
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 13:50     Ошибка при вызове wstring.erase
Посмотрите здесь:

Error C3867 при вызове функции erase и insert для двумерного вектора - C++
Тренируюсь с использованием контейнера std::vector. Появляется ошибка при удалении и вставке, помогите понять почему и как её исправить.......

Ошибка при использовании erase для std::vector - C++
Почему в случае удаления элемента из вектора с помощью передачи итератора в erase, который соответствует позиции удаляемого элемента...

Ошибка “vector<bool> erase iterator outside range” при работе алгоритма Хаффмана - C++
Проблема с функцией BuildTable. Компилируется, но в процессе работы возникает ошибка. // Huffmann.cpp: определяет точку входа для...

Ошибка при вызове деструктора - C++
Не могу дописать лабу... Надо создать 4 класса, описать поля и методы. Выкладываю исходники: Самый главный класс - Order. Выбивает ошибку в...

Ошибка при вызове деструктора - C++
Всем привет ! Есть класс class building { private: string *location_street; unsigned int *number_of_building; public...

Ошибка при вызове деструктора - C++
По окончании программы выдает ошибку #include &lt;string.h&gt; #include &lt;iostream&gt; using namespace std; class nik //объявление...

Ошибка при рекурсивном вызове - C++
На третьем вызове функции вылазит ошибка об отсутсвии инциализации переменой j, дебаг говорит, что после второго захода в функци j внезапно...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
5602 / 2636 / 242
Регистрация: 01.11.2011
Сообщений: 6,495
Завершенные тесты: 1
12.08.2014, 13:54     Ошибка при вызове wstring.erase #2
Цитата Сообщение от elektron5 Посмотреть сообщение
форум глючит
сирень квадрат

Цитата Сообщение от elektron5 Посмотреть сообщение
Почему erase ругается ?
Ошибку приведите пожалуйста.
elektron5
Заблокирован
12.08.2014, 14:09  [ТС]     Ошибка при вызове wstring.erase #3
Цитата Сообщение от SatanaXIII Посмотреть сообщение
сирень квадрат
Писал расширенный вопрос пол часа, потом мне в ответ, что мол нельзя писать в одном слове русский и английские буквы, а таких слов и не было. В общем сообщение после нескольких злостных кликов пропало
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ошибку приведите пожалуйста.
error C2664: 'std::_String_iterator<std::_String_val<std::_Simple_types<wchar_t>>> std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::erase(std::_String_const_iterator<std::_String_val<std::_Simple_types<wchar_t>>>,std::_String_const_iterator<std::_String_val<std::_Simple_types<wchar_t>>>)' : cannot convert argument 1 from 'std::reverse_iterator<std::_String_iterator<std::_String_val<std::_Simple_types<wchar_t>>>>' to 'unsigned int'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Добавлено через 4 минуты
Суть такова. Есть строка. Хочу пробежаться по ней в цикле с конца и найдя определённый символ удалить часть строки, начиная с этого символа до конца строки. Хочу сделать через итераторы, без них всё работает (ну если делать так - for(int i = testString.size() - 1; i != 0; i--). Причём на такой фокус:
C++
1
2
3
4
5
6
std::wstring testString = L"SHAKE YOUR TITS (. )^( .)";
for (auto it = testString.end(); it != testString.begin(); it--)
{
    if (*it == L'^')
        testString.erase(it, testString.end());
};
вообще вылетает экзепшен: string iterator not dereferencable

В первом посте я опечатался, там не it--, а it++, но к делу отношения это не имеет.
SatanaXIII
Супер-модератор
Эксперт С++
5602 / 2636 / 242
Регистрация: 01.11.2011
Сообщений: 6,495
Завершенные тесты: 1
12.08.2014, 14:10     Ошибка при вызове wstring.erase #4
L уберите в четвертой строке.
elektron5
Заблокирован
12.08.2014, 14:20  [ТС]     Ошибка при вызове wstring.erase #5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
L уберите в четвертой строке.
Ну а это - то здесь причём?
Ругается - то на строку testString.erase(it, testString.end());, т.к. он пытается итератор к целому числу позиции привести, тоесть не ту реализацию функции erase хочет использовать почему - то ...

P.S.: да и потом с четвёртой строкой у меня всё в порядке, обычная проверка wide char символа.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
12.08.2014, 14:27     Ошибка при вызове wstring.erase #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не хочу вмешиваться, но не кажется ли вам, что здесь:
C++
1
2
3
4
5
for (auto it = testString.end(); it != testString.begin(); it--)
{
    if (*it == L'^')
        testString.erase(it, testString.end());
};
На первой иттерации идет обращение за пределами строки?
А первый вариант ругается так как вы передаете в его параметры разные типы итераторов и естесствено компилятор будет пытаться вызвать "не ту" функцию.
Если вам это поможет то правильное решение примерно вот такое:
C++
1
2
3
4
5
    std::wstring testString = L"SHAKE YOUR TITS (. )^( .)";
    for (auto it = testString.rbegin(); it != testString.rend(); ++it) {
        if (*it == L'^')
            testString.erase(it.base() - 1 , testString.end());
    }
Хотя я пожалуй промолчу про методы rfind. Надеюсь вы их сами найдете
elektron5
Заблокирован
12.08.2014, 16:49  [ТС]     Ошибка при вызове wstring.erase #7
Цитата Сообщение от Ilot Посмотреть сообщение
На первой иттерации идет обращение за пределами строки?
всё верно , не заметил, но тогда уж надо делать так (что явно перебор )
C++
1
2
3
4
5
6
7
for (auto it = testString.end() - 1; it >= testString.begin(); it--)
{
    if (*it == L'I')
        testString.erase(it, testString.end());
    if (it == testString.begin())
        break;
};
Цитата Сообщение от Ilot Посмотреть сообщение
А первый вариант ругается так как вы передаете в его параметры разные типы итераторов и естесствено компилятор будет пытаться вызвать "не ту" функцию.
я думал, что итераторы - это простые указатели и разницы никакой, что обратный что нет - т.к. указывают на одну и ту же область памяти, ну да ладно, ошибался значит.
Цитата Сообщение от Ilot Посмотреть сообщение
Если вам это поможет то правильное решение примерно вот такое:
А это что за выкрутас it.base() - 1 ? Что он делает с обратным итератором? Наверное к не обратному приводит, но как ?

Цитата Сообщение от Ilot Посмотреть сообщение
Хотя я пожалуй промолчу про методы rfind
да, хороший способ, как то я и не подумал

Добавлено через 1 час 57 минут
Цитата Сообщение от Ilot Посмотреть сообщение
testString.erase(it.base() - 1
Объясните хоть что значит эта строка. По описанию функции base() не могу понять что она делает вообще и зачем нужна ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 17:16     Ошибка при вызове wstring.erase
Еще ссылки по теме:

Ошибка при вызове функции - C++
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции, до захода в нее, хотя список сформирован правильно, т.к. до...

Ошибка при вызове деструктора - C++
Программа компилиться нормально,но после выполнения system(&quot;pause&quot;); выползает непонятное окно,и указывает на ошибку в деструкторе.В чем...

Ошибка при вызове деструктора - C++
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции кода? #include &lt;conio.h&gt; #include &lt;iostream&gt; #include...

Ошибка при вызове деструктора - C++
Подскажите, что не так с этим деструктором? Просто выдает ошибку. Если его убираю то все идет норм. Если же оставляю, то куча всяких...

Ошибка при вызове метода - C++
Не пойму в чем ошибка... #include &lt;vector&gt; #include &lt;iostream&gt; template &lt;typename T&gt; class Beast { public: int x; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.08.2014, 17:16     Ошибка при вызове wstring.erase #8
elektron5, Возвращает прямой итератор, от которого был построен данный обратный. http://en.cppreference.com/w/cpp/ite..._iterator/base
Yandex
Объявления
12.08.2014, 17:16     Ошибка при вызове wstring.erase
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru