Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
elektron5
Заблокирован
1

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

12.08.2014, 13:50. Просмотров 898. Ответов 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()); 
};
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2014, 13:50
Ответы с готовыми решениями:

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

Ошибка при использовании erase для std::vector
Почему в случае удаления элемента из вектора с помощью передачи итератора в...

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

Ошибка при вызове метода класса, при чтении из файла
добрый день, пытаюсь считать данные из и запихнуть их в список в файле у меня...

Ошибка при вызове деструктора
По окончании программы выдает ошибку #include &lt;string.h&gt; #include &lt;iostream&gt;...

7
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
12.08.2014, 13:54 2
Цитата Сообщение от elektron5 Посмотреть сообщение
форум глючит
сирень квадрат

Цитата Сообщение от elektron5 Посмотреть сообщение
Почему erase ругается ?
Ошибку приведите пожалуйста.
0
elektron5
Заблокирован
12.08.2014, 14:09  [ТС] 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::_St ring_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++, но к делу отношения это не имеет.
0
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
12.08.2014, 14:10 4
L уберите в четвертой строке.
0
elektron5
Заблокирован
12.08.2014, 14:20  [ТС] 5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
L уберите в четвертой строке.
Ну а это - то здесь причём?
Ругается - то на строку testString.erase(it, testString.end());, т.к. он пытается итератор к целому числу позиции привести, тоесть не ту реализацию функции erase хочет использовать почему - то ...

P.S.: да и потом с четвёртой строкой у меня всё в порядке, обычная проверка wide char символа.
0
Ilot
Эксперт С++
1831 / 1189 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
12.08.2014, 14:27 6
Лучший ответ Сообщение было отмечено elektron5 как решение

Решение

Не хочу вмешиваться, но не кажется ли вам, что здесь:
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. Надеюсь вы их сами найдете
1
elektron5
Заблокирован
12.08.2014, 16:49  [ТС] 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() не могу понять что она делает вообще и зачем нужна ...
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.08.2014, 17:16 8
elektron5, Возвращает прямой итератор, от которого был построен данный обратный. http://en.cppreference.com/w/cpp/iterator/reverse_iterator/base
1
12.08.2014, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2014, 17:16

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

Ошибка при рекурсивном вызове
На третьем вызове функции вылазит ошибка об отсутсвии инциализации переменой j,...

Ошибка при вызове функции
Добрый день! Есть функция по расчету детерминанта int _det(int size,double...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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