Поиск…


замечания

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;


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow