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;