如何插入到 std::multimap 中的 std::map?

How to insert to std::map which is in std::multimap?

如何在地图中插入另一张地图?

在代码中,我尝试从另一个地图复制。

multimap<string, map<size_t, size_t>> sorted;

for (auto itr = m_Items.begin(); itr != m_Items.end(); ++itr)
    sorted.emplace(itr->first
        , make_pair(itr->second.m_Date.m_Time, itr->second.m_Cnt)
    );

假设您有 m_Items 作为

struct Date {
    std::size_t m_Time;
};

struct MyStruct
{
    Date m_Date;
    std::size_t m_Cnt;
};

std::multimap<std::string, MyStruct> m_Items;

那么你需要

for (auto itr = m_Items.begin(); itr != m_Items.end(); ++itr)
sorted.emplace(itr->first, std::map<size_t, size_t>{ {itr->second.m_Date.m_Time, itr->second.m_Cnt} });
//                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

您的地图的值再次是地图(即 std::map<size_t, size_t>)而不是 std::par。因此,你需要像上面那样插入。


with the help of structured binding declaration, and with a range based for loop(since ),你可以写得更直观:

for (const auto& [key, value] : m_Items)
  sorted.emplace(key, std::map<size_t, size_t>{ {value.m_Date.m_Time, value.m_Cnt} });
//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

这是一个(short demo.)


但是,如果您只需要一个未排序的 key-value 作为对作为 sorted 中的条目,我建议使用

std::multimap<std::string, std::pair<size_t, size_t>> sorted;
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^

而不是那里。

要使用 emplace,您必须匹配参数对。第二个参数必须是地图。

所以可以这样做:

    multimap<string, map<size_t, size_t>> sorted;

    for (auto itr = m_Items.begin(); itr != m_Items.end(); ++itr) {
        sorted.emplace(itr->first, map{make_pair(itr->second.m_Date.m_Time,
                                                 itr->second.m_Cnt)});
    }

https://godbolt.org/z/aK39haYz1