Контейнер QT, с указанным заказом и без повторов

Мне нужно что-то похожее на QSet, но мне нужно сохранить элементы в том порядке, в котором я их вставил

есть такая вещь?

2 ответа

Я не знаю ничего подобного из коробки ни в Qt, ни в STL. Думаю, в Boost есть что-то подобное, но это не так сложно сделать самостоятельно.

Вы могли бы сделать обертку вокруг QHash как это:

template<typename T>
class MySet : QHash<T, int>
{
public:
    using QHash<T, int>::QHash;

    QVector<T> values() //this 'hides' the base QHash::values() of QHash
    {
        QVector<T> vec(count());

        for(auto it = cbegin(); it != end(); ++it)
        {
            vec[it.value()] = it.key();
        }

        return vec;
    }

    void insert(const T &value)
    {
        if(!contains(value))
        {
            insert(value, m_Data.count());
        }
    }
};

Использование очень похоже на QSet:

MySet<QString> set;
set.insert("1");
set.insert("2");
set.insert("3");
qDebug() << set.values();

И это печатает значения по порядку. Если вам нужно больше complete Поддерживая подобные итераторы, также выполняющие итерации в нужном вам порядке, вам придется переопределить больше функциональности, но суть его будет такой же. В конце концов QSet внутренне QHash также. Обратите внимание, что выше не поддерживает удаление без изменений.

Может быть, QList или QVector могли бы помочь.

QList<QString> stringList;
//By the way, Qt provides QStringList as a typedef for QList<QString>
stringList.append("A");
stringList.append("B");

qDebug() << stringList.at(0); //A
qDebug() << stringList.at(1); //B
Другие вопросы по тегам