2011-10-23 54 views
7

我在找C++中的一個函數,用於交換地圖的內容... 即: 那些現在是密鑰的密鑰現在成爲項目和那些這些項目現在是關鍵。 你能告訴我,如果有什麼關於這件事?在C++中交換密鑰和地圖的值

+5

您可能想對multimap進行此操作,因爲地圖中的值不一定是不同的。 –

+0

我相信我的地圖的價值都是唯一的:沒有 重複 – Safari

回答

13

正如Geoffroy所說,std::map不允許這種行爲。但是,您可能需要使用類似STL的容器Boost.Bimap - 雙向映射。

Bimap是一種數據結構,它表示兩個集合的元素之間的雙向關係。該容器被設計爲作爲兩個相反的STL地圖工作。集合X與集合Y之間的bimap可以被視爲從X到Y(該視圖將被稱爲左側地圖視圖)或從Y到X(稱爲右側地圖視圖)的地圖。

1

有沒有標準的方法/方法來做到這一點,你必須編寫自己的函數。

這不是一件很難做的事情,但首先要考慮以不同的方式來做。

如果你不得不反轉你的鍵/值,那麼你的代碼可能會很糟糕,儘管你不保留容器的邏輯。

如果您想了解更多信息,請解釋您爲什麼要這麼做。

+0

我認爲boost有一個迭代器適配器可能會使這個容易 –

+0

是的,也許,我不知道那麼多關於提升的時刻。但這並不難。 – Geoffroy

+0

我必須讀取一個帶有row-id字符串的文件。我需要我的算法,這個值是一個整數(出於效率的原因,而不是字符串)使用地圖與這些字符串關聯一個id唯一。在地圖中,我intID字符串。我需要以我的舊格式id-string獲得算法的結果,因此對於映射的所有相應值中的每個IdInt搜索字符串,我都有。爲了加速這可以做一個交換 – Safari

1

插入地圖中的項放入多重映射 - 第一值,第二鍵,條件是比較原始地圖的兩個值適當的比較功能。一旦插入了所有值鍵項目,multimap將按預期進行排序。任務完成!

1
template <class T1, class T2> 
map<T2, T1> swapPairs(map<T1, T2> m) { 
    map<T2, T1> m1; 

    for (auto&& item : m) { 
     m1.emplace(item.second, item.first); 
    } 

    return m1; 
}; 

int main() { 
    map<string, int> m; 
    m.emplace("111",5); 

    cout << m.at("111") << endl; // 5 

    map<int,string> m1 = swapPairs(m); 

    cout << m1.at(5) << endl; // 111 

    return 0; 
}