2014-07-24 245 views
1

我遇到了一個問題,在我的工作我怎麼能初始化unordered_map < vector<int>>?

有在我的C vector<int>unordered_map ++類
這樣unordered_map < int, vector<int> >

所以我怎麼能初始化嵌套的容器,這樣,當我插入一個關鍵散列表 和值(矢量)將十零?

+0

什麼是地圖中的關鍵? –

+0

@JoachimPileborg對不起,關鍵是int –

+0

你想要那個'map [key]'返回一個'vector '用10 0初始化,當沒有其他東西插入那個關鍵字時,就是這樣? – Johan

回答

1

根據你在你需要一個固定大小的數組的意見陳述。 這裏一個小例子:

#include <array> 
#include <unordered_map> 
#include <iostream> 

int main(int, char const *[]) 
{ 
    std::unordered_map<int, std::array<int, 10>> the_map; 

    std::cout << the_map[0][1] << std::endl; 
    the_map[0][2]++; 
    std::cout << the_map[0][2] << std::endl; 
    return 0; 
} 

輸出將是:

0 
1 

如果要更改默認值,你可以這樣做:

struct my_array : public std::array<int, 10> { my_array() { fill(2); } }; 

int main(int , char const *[]) 
{ 
    std::unordered_map<int, my_array> the_map; 

    std::cout << the_map[0][1] << std::endl; 
    the_map[0][2]++; 
    std::cout << the_map[0][2] << std::endl; 
    return 0; 
} 

輸出:

2 
3 

不是我最喜歡的選擇,但你可以這樣做。

+0

怎麼樣10兩個? –

+0

@Shanicky_C什麼是「10二」? – Johan

+0

{2,2,2,2,2,2,2,2,2,2} –

2

這很簡單:

std::unordered_map<int, std::vector<int>> my_map; 

my_map[123] = std::vector<int>{1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; 

現在my_map將包含一個條目,關鍵123和數據是包含十個條目的向量。

+0

中寫60零,非常感謝,但向量可能是100 0在未來 –

+0

@Shanicky_C閱讀['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)及其[構造函數](http://en.cppreference。 com/w/cpp/container/vector) –

2

您可以使用列表初始化:

std::unordered_map<int, std::vector<int>> m 
    { { 2, std::vector<int>(10, 0) } 
    , { 5, std::vector<int>(10, 0) } 
    , { 6, std::vector<int>(10, 0) } 
    , { 9, std::vector<int>(10, 0) } 
    }; 
+0

非常感謝,但我只是想初始化,以便當一個密鑰插入哈希表並且向量將自動爲零0時 –

+0

@Shanicky_C:那麼,永遠只是「插入一把鑰匙」,所以這個問題並不重要盟友是有道理的:你總是插入一個完整的*值*,這是一對關鍵和映射元素。 –

2

不允許用戶直接訪問地圖,讓他們去通過訪問,這樣可以保證矢量被填充你怎麼想:

class FooBar 
{ 
public: 
    // access the map 
    std::vector<int>& operator[](int n); 

private: 
    std::unordered_map<int, std::vector<int>> map; 
}; 

std::vector<int>& FooBar::operator[](int n) 
{ 
    auto iter = map.find(n); 
    if (iter == map.end()) // index not found, so insert it 
    iter = map.emplace(n, std::vector<int>(10, 0)).first; 
    return *iter; 
}