[Переписать с оригинала]
Непонятно, хочет ли OP узнать, «как [я] обращаю QList?» или на самом деле хочет перевернутую копию. Пользователь mmutz дал правильный ответ для перевернутой копии, но если вы просто хотите перевернуть QList на месте, вот что:
#include <algorithm>
А потом
std::reverse(list.begin(), list.end());
Или в C ++ 11:
std::reverse(std::begin(list), std::end(list));
Прелесть стандартной библиотеки C ++ (и шаблонов в целом) заключается в том, что алгоритмы и контейнеры являются отдельными. Поначалу может показаться раздражающим, что стандартные контейнеры (и в меньшей степени контейнеры Qt) не имеют вспомогательных функций, таких как list.reverse()
, но рассмотрим альтернативы: что более элегантно: предоставить методы reverse()
для всех контейнеров, или определить стандартный интерфейс для всех контейнеров, которые допускают двунаправленную итерацию, и обеспечить одну реализацию reverse()
, которая работает для всех контейнеров, поддерживающих двунаправленную итерацию?
Чтобы проиллюстрировать, почему это элегантный подход, рассмотрим ответы на некоторые похожие вопросы:
«Как перевернуть std::vector<int>
?»:
std::reverse(std::begin(vec), std::end(vec));
«Как перевернуть std::deque<int>
?»:
std::reverse(std::begin(deq), std::end(deq));
А как насчет частей контейнера?
«Как перевернуть первые семь элементов QList
?»: Даже если бы авторы QList
предоставили нам удобный метод .reverse()
, они, вероятно, не дали бы нам эту функциональность, но здесь это:
if (list.size() >= 7) {
std::reverse(std::begin(list), std::advance(std::begin(list), 7));
}
Но это становится лучше: поскольку интерфейс итератора совпадает с синтаксисом указателя C, а C ++ 11 добавил свободные функции std::begin()
и std::end
, вы можете сделать это:
«Как перевернуть массив float x[10]
?»:
std::reverse(std::begin(x), std::end(x));
или до C ++ 11:
std::reverse(x, x + sizeof(x) / sizeof(x[0]));
(Это уродство, которое std::end()
скрывает для нас.)
Давайте продолжим:
«Как вы реверсируете буфер float* x
размером n
?»:
std::reverse(x, x + n);
«Как перевернуть строку с нулевым символом в конце char* s
?»:
std::reverse(s, s + strlen(s));
«Как перевернуть необязательно завершающуюся нулем строку char* s
в буфере размером n
?»:
std::reverse(s, std::find(s, s + n, '\0'));
Обратите внимание, что std::reverse
использует swap()
, поэтому даже это будет работать так же хорошо, как это возможно:
QList<QList<int> > bigListOfBigLists;
....
std::reverse(std::begin(bigListOfBigLists), std::end(bigListOfBigLists));
Также обратите внимание, что все они должны работать так же, как и рукописный цикл, поскольку, когда это возможно, компилятор превратит их в арифметику указателей. Кроме того, вы не можете просто написать многоразовую, универсальную, высокопроизводительную функцию reverse
, подобную этой C.