2016-01-19 80 views
2

我有一段代碼操作map<int,int>對象。比方說,在某些時候我想把所有的條目,鍵和值加倍。有沒有辦法做到這一點,沒有創建一個新的地圖,循環和輸入更新的條目?更新地圖

我的問題是節省內存空間。

+3

請出示你的代碼,請注意,修改你的地圖將使所有迭代器的鍵被用作該映射重新排序,也就是爲什麼你會想修改這樣的關鍵?你確定你想要一個'map'嗎? – EdChum

+0

我不認爲,即使你發現這樣的事情,它會節省大量的內存或處理能力。最後,大部分功能只是在背景中做你想避免的事情。 – Sossenbinder

+1

你的問題沒有很好的定義。加倍鑰匙可能會給你一個已經存在的元素的關鍵。你會增加哪個價值? – juanchopanza

回答

2

加倍值可以是這樣的:

std::map<int,int> my_map; 
for(auto& item:my_map){ 
    item.second*=2; // double all values 
} 

然而,這是不可能的兩倍,因爲itemKey是從類型std::pair<const int,int>。請注意0​​爲Key

建議

我覺得std::map是不是這種情況下,最好的容器。試試這個方法:

std::vector<std::pair<int,int>> my_simi_map; 
for(auto& my_simi_map){ 
    item.first*=2; // double all keys 
    item.second*=2; // double all values 
} 

編輯:

我關心的是節省存儲空間。

如果只是內存問題,那麼你可以從地圖中選擇一個項目,並在新地圖中插入一個加倍版本,並直接從舊地圖中刪除它。在這種情況下,您將忽略地圖的一個元素的大小,而不是整個另一個地圖的大小。

1

您可以按正向鍵的相反順序遍歷地圖,以規避副作用並創建新的鍵/值對。你可以做相同的否定鍵。

#include <cstdio> 
#include <algorithm> 
#include <map> 

using namespace std; 

int main() { 
    map<int, int> m = { 
    {10, 20}, 
    {-5, 23}, 
    {-10, 7}, 
    {20, 30}, 
    {15, 21}, 
    {18, 2}, 
    }; 

    for (auto it = m.begin(); it != m.end() && it->first < 0; it = m.erase(it)) { 
    m[it->first * 2] = 2 * it->second; 
    } 

    for (auto it = m.rbegin(); it != m.rend() && it->first > 0; it++) { 
    m[it->first * 2] = 2 * it->second; 
    m.erase(----it.base()); 
    } 

    for (auto &p: m) { 
    printf("%d, %d\n", p.first, p.second); 
    } 
} 

輸出:

-20, 14 
-10, 46 
20, 40 
30, 42 
36, 4 
40, 60