[英]QMap and QPair, C++, Qt
我想通過兩種方式創建一個用於訪問字符串的數據結構:
我的第一個想法是為每種方法使用兩個映射,但它會導致數據重復:
QMap<int, QString> accessById;
QMap<QString, QString> accessByName;
我正在尋找更好的方法,如下所示:
QMap<QPair<int, QString>, QString> multiAccess;
但它無法幫助我(至少我不知道該怎么做),因為在地圖中搜索需要知道ID和名稱。 如何定義Qt類的井結構以實現我的目標?
沒有外部庫,但Qt
怎么樣:
QMap<QString, int> nameIdMap;
QMap<int, QString> accessById;
您可以通過id訪問並為名稱和ID創建地圖。 然后你可以通過名字訪問
QString data = accessById[nameIdMap[the_name]];
由於“隱式共享”,Qt沒有像許多其他類庫那樣擔心重復數據:
http://doc.qt.nokia.com/latest/implicit-sharing.html
具有此屬性的類列表(包括QString
)包含在該鏈接中。 有助手可以創建自己的類,這些類也使用Copy-On-Write策略:
http://en.wikipedia.org/wiki/Copy-on-write
http://doc.qt.nokia.com/latest/qshareddatapointer.html#details
總結一下:如果你有一個10,000字符的QString並將其分配給另一個QString變量,你將不會支付另外10,000個字符的存儲空間(除非你修改兩個實例之一的字符串數據)。 盡管如此,即使是只讀的QString句柄也比int
大一點。 這取決於您的場景,這種大小差異是否顯着與多次查找的速度權衡相比,如@Juho提供的策略。
您可以使用Boost Bimap ,它將在id和Name之間創建雙向映射。
boost::bimap<int, QString> idNameBimap;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.