簡體   English   中英

QMap和QPair,C ++,Qt

[英]QMap and QPair, C++, Qt

我想通過兩種方式創建一個用於訪問字符串的數據結構:

  1. 按ID訪問
  2. 按名稱訪問

我的第一個想法是為每種方法使用兩個映射,但它會導致數據重復:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM