C++插入到地图<双精度、多地图<整数、对象*>>

C++ inserting into a map<double, multimap<int, Object*>>

本文关键字:gt lt 地图 对象 整数 双精度 插入 C++      更新时间:2023-10-16

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

您似乎想要:

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*>实例属于。

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;
}

如果您使用基于远程的for循环,这将更简单:

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...
    }
}