2017-09-19 63 views
0

如何插入到map<double, multimap<int, Object*> >?我試過mymap.insert(make_pair(double, make_pair(int, Object*)));。此外,如何在迭代時訪問Object*?我試過C++插入地圖<double,multimap <int,Object * >>

+2

如該插入對第二個是*不*一個'multi_map '實例(這是一個簡單的對'int'的和'Object *'),它的失敗並不奇怪。而且因爲'it-> second-> second'對任何*鍵映射範例都沒有意義。 – WhozCraig

回答

2

你似乎在想:

using MyMap = std::map<double, std::multimap<int, Object*> >; 

MyMap mymap; 
mymap.insert(std::make_pair(dbl, std::multimap<int, Object*>()); 

要列舉:

#include <iostream> 
#include <map> 

struct Object {}; 

int main() 
{ 
    using MyMap = std::map<double, std::multimap<int, Object*> >; 

    MyMap mymap; 
    auto ins = mymap.insert(std::make_pair(42.0, std::multimap<int, Object*>())); 

    Object obj1, obj2; 
    ins.first->second.insert(std::make_pair(7, &obj1)); 
    ins.first->second.insert(std::make_pair(7, &obj2)); 

    for (auto const& pr : mymap) 
    { 
     std::cout << "dblkey: " << pr.first << '\n'; 
     for (auto const& pr2 : pr.second) 
     { 
      std::cout << "\tintkey: "<< pr2.first 
         << ", value: " << static_cast<const void*>(pr2.second) << '\n'; 
     } 
    } 
} 

輸出(指針值會發生變化,很明顯)

dblkey: 42 
    intkey: 7, value: 0x7fff5fbff160 
    intkey: 7, value: 0x7fff5fbff158 

最後,你的問題是一個比其他任何問題更重要的問題。您試圖插入一個std::pair<int, Object*>,其中一個std::multimap<int, Object*>實例屬於該實例。

2

std::map<double, std::multimap<int, Object*> >中,第二個值是單個std::multimap對象,但您試圖將其設置爲std::pair對象。 std::multimap沒有接受std::pair作爲輸入的構造函數,這就是代碼失敗的原因。

您需要構造一個std::multimap對象插入到std::map,如:

double d = ...; 
int i = ...; 
Object *obj = ...; 

std::multimap mm; 
mm.insert(std::make_pair(i, obj)); 
mymap.insert(std::make_pair(d, mm)); 

或者:

mymap[d].insert(std::make_pair(i, obj)); 

當迭代std::map,它會返回一個迭代到std::pair其中->firstdouble->secondstd::multimap<int, Object*>

當迭代std::multimap,它會返回一個迭代到std::pair其中->firstint->secondObject*

auto iter1 = mymap.begin; 
while (iter1 != mymap.end()) 
{ 
    auto &mm = iter1->second; // mm = std::multimap<int, Object*> 

    auto iter2 = mm.begin(); 
    while (iter2 != mm.end()) 
    { 
     auto obj = iter2->second; // obj = Object* 
     // use obj as needed... 
     ++iter2; 
    } 
    ++iter1; 
} 

,如果你使用的ranged-based for loop代替這將是簡單的:

for (auto &v1: mymap) // v1 = std::pair<double, std::multimap<int, Object*> > 
{ 
    auto &mm = v1.second; // mm = std::multimap<int, Object*> 

    for (auto &v2: mm) // v2 = std::pair<int, Object*> 
    { 
     auto obj = v2.second; // obj = Object* 
     // use obj as needed... 
    } 
} 
相關問題