Russian Qt Forum

Qt => Общие вопросы => Тема начата: titan83 от Январь 14, 2017, 18:18



Название: [РЕШЕНО] iterator для QString в обратном порядке
Отправлено: 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;
Может кто посоветует элегантный вариант.
Спасибо.


Название: Re: iterator для QString в обратном порядке
Отправлено: Johnik от Январь 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;
}
 


Название: Re: iterator для QString в обратном порядке
Отправлено: kambala от Январь 14, 2017, 18:47
QString::rbegin()/QString::rend() — итераторы для обратного порядка.

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


Название: Re: iterator для QString в обратном порядке
Отправлено: Авварон от Январь 14, 2017, 19:16
Код:
    
for (int i = STRING.size() - 1; i > -1; i--)
     qDebug() << STRING.at(i);

Так делать нельзя, потому что вы суррогатные пары будете обходить не в том порядке.


Название: Re: iterator для QString в обратном порядке
Отправлено: titan83 от Январь 14, 2017, 20:44
QString::rbegin()/QString::rend() — итераторы для обратного порядка.

а еще можно сделать предварительно std::reverse(string), но это меняет строку.
kambala, благодарю, то, что доктор прописал. стало так:
Код:
    for (auto it = col.rbegin(); it != col.rend(); it++) {
        qDebug() << *it;


Название: Re: iterator для QString в обратном порядке
Отправлено: titan83 от Январь 14, 2017, 20:45
Код:
    
for (int i = STRING.size() - 1; i > -1; i--)
     qDebug() << STRING.at(i);

Так делать нельзя, потому что вы суррогатные пары будете обходить не в том порядке.
Вы правы, спасибо. Но у меня строго ASCII, так что тут я увернулся от этой подачи))


Название: Re: iterator для QString в обратном порядке
Отправлено: titan83 от Январь 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)