我想將一個代碼從perl轉換爲C++,而我的問題是perl中的多鍵映射! 例如:將perl映射與多個鍵轉換爲C++
的Perl:
$address{name}{familyName} = $someAddress;
和密鑰不是唯一的。 我想在C++中使用map或...!的類似數據結構? 我也想用第一個鍵搜索和獲取值,例如我想在C++中使用這樣的%keys {name}。
編輯:我想知道是否有任何姓氏爲特殊名稱存在或不存在,也姓名和姓氏在一起是關鍵和獨特不是每個人。
我想將一個代碼從perl轉換爲C++,而我的問題是perl中的多鍵映射! 例如:將perl映射與多個鍵轉換爲C++
的Perl:
$address{name}{familyName} = $someAddress;
和密鑰不是唯一的。 我想在C++中使用map或...!的類似數據結構? 我也想用第一個鍵搜索和獲取值,例如我想在C++中使用這樣的%keys {name}。
編輯:我想知道是否有任何姓氏爲特殊名稱存在或不存在,也姓名和姓氏在一起是關鍵和獨特不是每個人。
你想要的東西,如:
#include <map>
#include <string>
struct Person {
Person(const std::string & n, const std::string & f)
: name(n), family(f) {}
bool operator<(const Person & p) const {
if (family < p.family) return true;
else if (family == p.family) return name < p.name;
else return false;
}
std::string name;
std::string family;
};
int main() {
std::multimap <Person, std::string> amap;
amap.insert(
std::make_pair(Person("fred", "bloggs"), "somewhere")
);
// alternate, though semantically somewhat different syntax
amap[ Person("fred", "bloggs") ] = "new address";
}
結構體需要'operator <''。不是嗎? – Naveen 2010-03-15 13:13:47
@Naveen,你需要爲你的鍵或某個比較函數定義的operator <',它成爲了地圖類型的一部分。 – 2010-03-15 14:25:53
+1,用於將姓名和姓氏壓縮到單個關鍵對象中。 – 2010-03-15 14:26:45
相當於%keys{name}
是用std::map
完成的。您可以使用括號運算符來訪問地圖的元素。如果你要求一個還沒有的鍵,它會方便地插入一個新的默認構造對象。您可以使用地圖地圖複製多鍵地圖,例如std::map<std::string, std::map<std::string, std::string> >
。
如果您的密鑰可能具有多個與其關聯的值,請使用std::multimap
而不是map
。
我想知道是否有任何特殊姓名的姓氏存在或不存在,姓名和姓氏一起是關鍵和唯一不是每個人。 – Yadollah 2010-03-24 15:57:34
@YY,那麼你可能需要沿Neil的答案,因爲全名是獨一無二的。要確定是否存在某個特定的家族或名稱,可以簡單地將map從'begin()'移動到'end()',並將該名稱與'Person'結構的適當部分進行比較。 – 2010-03-24 16:21:51
如果密鑰不唯一,則必須使用std::multimap
而不是std::map
。鍵的唯一性正是這兩者之間的區別。
tnx爲您提供幫助。 我找到了一個簡單的解決方案來解決我的問題。 它有兩個映射:一個用於映射具有某個familyName的名稱的multimap。 和一張地圖名稱和家庭地址。 響應我的查詢速度非常快! – Yadollah 2010-03-29 12:25:02
Perl的哈希的關鍵是獨一無二的。 – kennytm 2010-03-15 13:13:43