crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Присвоение итератора
Гость_Value_*
сообщение 3.8.2015, 23:01
Сообщение #1





Гости








    


Добрый вечер, прошу помочь разобраться с проблемой.
Есть строка QString, в ней текст, пытаюсь эту строку присвоить другой строке, перевернув ее задом на перед, через итератор по-символьно.
Проблема в следующем, почему к строке не прибавляет символ через итератор??
Вот код.
QString str="hello";
    QString result;
    for(QString::iterator it=str.end();it!=str.begin();it--)
    {

        QString r=*it;
        result.operator +=(r);  // result.append(r)  //  result.append(*it)   // result.push_back(r)   и т.д. не помогают.

    }
qDebug()<<result  //строка пустая.


Почему строка пустая ?

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.8.2015, 9:15
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Потому что str.end() возвращает невалидный итератор, невалидный итератор нельзя никуда перемещать.
Используйте индексацию [] или .at
http://doc.qt.io/qt-5/qstring.html#at
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 4.8.2015, 10:52
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


вообще странно, что в Qt до сих пор не было reverse_iterator.
сами они предлагают делать примерно так:
QString::iterator it = str.end();
while ( it != str.begin() )
{
    --it;
   .....
}

в новых версиях реверс-итераторы уже добавили:
https://codereview.qt-project.org/#/c/109931/
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.8.2015, 13:47
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
сами они предлагают делать примерно так:

При STL такой фигни не было :lol:

Вообще странно, потому что в первом посте такая реализация.
А где это они такое рекомендуют?
Нашел, все нашел.


А не работает скорее всего из за разыменования невалидного итератора на первой итерации.
Iron Bug правильный вариант говорит.

Сообщение отредактировал lanz - 4.8.2015, 13:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Value_*
сообщение 4.8.2015, 16:25
Сообщение #5





Гости








    


Понял, спасибо за ответы, решил проблему так:
...
for(QString::iterator it=str.end();it!=str.begin();it--)
    {

        QString r=*(it-1);
        result.operator +=(r);  

    }
...


Но вот странно что, когда я пытался сделать как раньше:
for(QString::iterator it=str.end();it!=str.begin();it--)
    {

        QString r=*it;
        qDebug()<<r;

    }
...

То объекту r присваивалось значение, но его никуда нельзя было добавить, на qDebug() было видно его.

Спасибо!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 5.8.2015, 10:09
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


ты не можешь взять значение (*) итератора str.end(). потому что это не обычный итератор, а специальная абстракция для указания на конец элементов. вызов невалиден и, по идее, должен вызывать ошибку обращения к памяти.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 14:17