Qt
Классы контейнеров Qt
Поиск…
замечания
Qt предоставляет свои собственные классы контейнеров шаблонов. Все они неявно разделяются. Они предоставляют два типа итераторов (стиль Java и стиль STL).
В последовательные контейнеры Qt входят: QVector, QList, QLinkedList, QStack, QQueue.
Ассоциативные контейнеры Qt включают: QMap, QMultiMap, QHash, QMultiHash, QSet.
Использование QStack
QStack<T>
- это класс, предоставляющий стек класса Qt. Его аналогом в STL является std::stack
. Это последняя в первой структуре (LIFO).
QStack<QString> stack;
stack.push("First");
stack.push("Second");
stack.push("Third");
while (!stack.isEmpty())
{
cout << stack.pop() << endl;
}
Он будет выводить: Третий, Второй, Первый.
QStack
наследует от QVector
поэтому его реализация сильно отличается от STL. В STL std::stack
реализуется как оболочка для типа, переданного как аргумент шаблона (по умолчанию - deque). Все же основные операции одинаковы для QStack
и для std::stack
.
Использование QVector
QVector<T>
предоставляет класс шаблонов динамических массивов. Он обеспечивает лучшую производительность в большинстве случаев, чем QList<T>
поэтому он должен быть первым выбором.
Его можно инициализировать различными способами:
QVector<int> vect;
vect << 1 << 2 << 3;
QVector<int> v {1, 2, 3, 4};
Последний включает список инициализации.
QVector<QString> stringsVector;
stringsVector.append("First");
stringsVector.append("Second");
Вы можете получить i-й элемент вектора таким образом:
v[i]
или at[i]
Убедитесь, что i
действительная позиция, даже если at(i)
не делает проверку, это отличие от std::vector
.
Использование QLinkedList
В Qt вы должны использовать QLinkedList, если вам нужно реализовать связанный список .
Быстро добавлять, добавлять, вставлять элементы в QLinkedList
O (1), но индексный поиск медленнее, чем в QList
или QVector
O (n). Это нормально, принимая во внимание, что вам нужно перебирать узлы, чтобы найти что-то в связанном списке.
Полную таблицу алгоритмических сравнений можно найти здесь .
Чтобы вставить некоторые элементы в QLinkedList
вы можете использовать оператор <<()
:
QLinkedList<QString> list;
list << "string1" << "string2" << "string3";
Чтобы вставлять элементы в середине QLinkedList
или изменять все или некоторые его элементы, вы можете использовать итераторы стиля Java или STL. Вот простой пример того, как мы умножаем все элементы QLinkedList
на 2:
QLinkedList<int> integerList {1, 2, 3};
QLinkedList<int>::iterator it;
for (it = integerList.begin(); it != integerList.end(); ++it)
{
*it *= 2;
}
QList
Класс QList
- это шаблонный класс, который предоставляет списки. Он хранит элементы в списке, который обеспечивает быстрый индексный доступ и вставки и удаления на основе индекса.
Чтобы вставить элементы в список, вы можете использовать operator<<()
, insert()
, append()
или prepend()
. Например:
operator<<()
QList<QString> list;
list << "one" << "two" << "three";
insert()
QList<QString> list;
list << "alpha" << "beta" << "delta";
list.insert(2, "gamma");
append()
QList<QString> list;
list.append("one");
list.append("two");
list.append("three");
prepend()
QList<QString> list;
list.prepend("one");
list.prepend("two");
list.prepend("three");
Чтобы получить доступ к элементу в определенной позиции индекса, вы можете использовать operator[]()
или at()
. at()
может быть быстрее, чем operator[]()
, он никогда не вызывает глубокую копию контейнера и должен работать в постоянном режиме. Ни один из них не выполняет проверку аргументов. Примеры:
if (list[0] == "mystring")
cout << "mystring found" << endl;
Или же
if (list.at(i) == "mystring")
cout << "mystring found at position " << i << endl;
Для удаления элементов существуют такие функции, как removeAt()
, takeAt()
, takeFirst()
, takeLast()
, removeFirst()
, removeLast()
или removeOne()
. Примеры:
takeFirst()
// takeFirst() removes the first item in the list and returns it
QList<QWidget *> list;
...
while (!list.isEmpty())
delete list.takeFirst();
removeOne()
// removeOne() removes the first occurrence of value in the list
QList<QString> list;
list << "sun" << "cloud" << "sun" << "rain";
list.removeOne("sun");
Чтобы найти все вхождения определенного значения в списке, вы можете использовать indexOf()
или lastIndexOf()
. Пример:
indexOf()
int i = list.indexOf("mystring");
if (i != -1)
cout << "First occurrence of mystring is at position " << i << endl;