Контейнер 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