Russian Qt Forum
Ноябрь 23, 2024, 04:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] iterator для QString в обратном порядке  (Прочитано 6559 раз)
titan83
Гость
« : Январь 14, 2017, 18:18 »

Коллеги, здравствуйте.
Понадобилось мне пройтись по QString в обратном порядке.
Я, конечно, сделал так:
Код:
    
for (int i = STRING.size() - 1; i > -1; i--)
     qDebug() << STRING.at(i);
Но хотелось бы с итераторами, чтобы выглядело пологичнее, например:
Код:
 
for (const auto& s : reverse(STRING))
     qDebug() << s;
Может кто посоветует элегантный вариант.
Спасибо.
« Последнее редактирование: Январь 14, 2017, 20:45 от titan83 » Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Январь 14, 2017, 18:47 »

для Qt 5.6:

Код
C++ (Qt)
template <typename C>
struct reverse_wrapper
{
C& c_;
reverse_wrapper(C & c) :  c_(c) {}
 
typename C::reverse_iterator begin() {return c_.rbegin();}
typename C::reverse_iterator end() {return c_.rend(); }
};
 
template <typename C>
reverse_wrapper<C> reverse(C& c)
{
return reverse_wrapper<C>(c);
}
 
 
int main(int argc, char *argv[])
{
QString sss = "1234";
for (QChar& c : reverse(sss))
{
qDebug() << c;
}
return 0;
}
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Январь 14, 2017, 18:47 »

QString::rbegin()/QString::rend() — итераторы для обратного порядка.

а еще можно сделать предварительно std::reverse(string), но это меняет строку.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Январь 14, 2017, 19:16 »

Код:
    
for (int i = STRING.size() - 1; i > -1; i--)
     qDebug() << STRING.at(i);

Так делать нельзя, потому что вы суррогатные пары будете обходить не в том порядке.
Записан
titan83
Гость
« Ответ #4 : Январь 14, 2017, 20:44 »

QString::rbegin()/QString::rend() — итераторы для обратного порядка.

а еще можно сделать предварительно std::reverse(string), но это меняет строку.
kambala, благодарю, то, что доктор прописал. стало так:
Код:
    for (auto it = col.rbegin(); it != col.rend(); it++) {
        qDebug() << *it;
« Последнее редактирование: Январь 14, 2017, 20:47 от titan83 » Записан
titan83
Гость
« Ответ #5 : Январь 14, 2017, 20:45 »

Код:
    
for (int i = STRING.size() - 1; i > -1; i--)
     qDebug() << STRING.at(i);

Так делать нельзя, потому что вы суррогатные пары будете обходить не в том порядке.
Вы правы, спасибо. Но у меня строго ASCII, так что тут я увернулся от этой подачи))
Записан
titan83
Гость
« Ответ #6 : Январь 14, 2017, 20:46 »

для Qt 5.6:

Код
C++ (Qt)
template <typename C>
struct reverse_wrapper
{
C& c_;
reverse_wrapper(C & c) :  c_(c) {}
 
typename C::reverse_iterator begin() {return c_.rbegin();}
typename C::reverse_iterator end() {return c_.rend(); }
};
 
template <typename C>
reverse_wrapper<C> reverse(C& c)
{
return reverse_wrapper<C>(c);
}
 
 
int main(int argc, char *argv[])
{
QString sss = "1234";
for (QChar& c : reverse(sss))
{
qDebug() << c;
}
return 0;
}
 

Спасибо большое, но я предпочитаю less code, less bugs)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 22.