C ++插入地图<double,multimap <int,=“”object * =“”>&gt;

时间:2017-09-19 22:47:39

标签: c++ maps

如何插入map<double, multimap<int, Object*> >? 我试过了mymap.insert(make_pair(double, make_pair(int, Object*)));。此外,如何在迭代时访问Object*? 我试过it->second->second

2 个答案:

答案 0 :(得分: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*>

答案 1 :(得分:2)

export default class Struct { static get default () { return Struct } ... } 中,第二个值是单个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->second

在迭代std::multimap<int, Object*>时,它会返回一个std::multimap的迭代器,其中std::pair->firstint->second。< / p>

Object*

如果您使用ranged-based for loop代替:

,这会更简单
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;
}