2017-09-19 10 views
0

どのように1はmap<double, multimap<int, Object*> >に挿入するのでしょうか? 私はmymap.insert(make_pair(double, make_pair(int, Object*)));を試してみました。さらに、それを反復するときに、Object*にはどのようにアクセスしますか? 私はit->second->secondを試してみました。C++マップ<ダブル、マルチマップ<int型、オブジェクトに挿入* >>

+2

その挿入されたペアの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::multimap<int, Object*>インスタンスが属しstd::pair<int, Object*>を挿入しようとしていました。

2

std::map<double, std::multimap<int, Object*> >の場合、2番目の値は単一のstd::multimapオブジェクトですが、代わりにstd::pairオブジェクトに設定しようとしています。 std::multimapあなたのコードが失敗した理由ですstd::pair入力として受け取るコンストラクタを持っていません。

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を反復すると、それは->firststd::pairにイテレータを返します。あなたがstd::mapに挿入するstd::multimapオブジェクト、例えばを構築する必要がある

doubleあると->secondstd::multimap<int, Object*>です。 std::multimapを反復すると

することは、それが->firstintあると->secondObject*あるstd::pairにイテレータを返します。

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... 
    } 
} 
関連する問題