2

我需要类似于 QSet 的东西,但我需要按照插入的顺序保存项目

有这样的事吗?

4

2 回答 2

3

我不知道在 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也是如此。请注意,以上不支持不修改就删除。

于 2017-01-08T10:16:27.840 回答
-1

也许 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
于 2017-01-08T10:00:51.890 回答