2017-01-08 51 views
1

我需要類似的財產以後展示Qset,但我需要的物品要保存我插入他們QT容器,具有指定順序和重複沒有

的順序是有這樣的事情嗎?

+0

沒有足夠信息迴應:什麼類型的項目你使用,你怎麼想插入並訪問他們...它可以是任何的下一個容器:[QMAP(HTTP://doc.qt。 io/qt-5/qmap.html),[QHash](http://doc.qt.io/qt-5/qhash.html#qhash),[QVector](http://doc.qt.io/ qt-5/qvector.html),[QList](http://doc.qt.io/qt-5/qlist.html)等...請參閱[Qt容器類](http://doc.qt .io/qt-5/containers.html) –

+0

@VladimirBershov - 您提到的容器要麼重複,要麼不通過插入它們的順序保存項目。 – kakush

+0

爲什麼不簡單[QVector :: append()](http://doc.qt.io/qt-5/qvector.html#append)或[insert()](http://doc.qt.io/ QT-5/qvector.html#插入)? –

回答

-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 
0

我不知道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(); 

而且爲了使打印出數值。如果你需要更多的支持,像迭代器也按照你想要的順序迭代,你將不得不重新實現更多的功能,但其要點將是相同的。畢竟QSet在內部也是QHash。請注意,上述內容不支持未經修改的移除。