首页 > 解决方案 > 当两个 std::map 对象相同时

问题描述

我有两个std::map使用相同数据填充的对象,但顺序不同:

using TMap = std::map<int, std::wstring>;
using TSourceData = std::vector< std::pair<int, std::wstring> >;

TSourceData gen_source_data(int size)
{
    TSourceData result;
    result.reserve(size);

    for(int i = 0; i < size; ++i)
    {
        result.push_back( std::make_pair(i, std::to_wstring(i)) );
    }

    return result;
}

TMap fill_map(const TSourceData& source)
{
    TMap result;

    auto randomized = source;
    std::random_shuffle(randomized.begin(), randomized.end());

    for(const auto &e : randomized)
    {
        result[e.first] = e.second;
    }

    return result;
}

int main()
{
    auto source = gen_source_data(1000);

    auto m1 = fill_map(source);
    auto m2 = fill_map(source);

    std::wcout << (m1 == m2) << std::endl;
}

在 VS2017 中,它似乎总是打印1,所以无论它们以什么顺序填充,两张地图都是相等的。但能保证如此吗?如果是这样,你能解释一下为什么吗?

标签: c++dictionaryequality

解决方案


std::map是一个关联容器。顺序容器和关联容器的区别在于:

此外,由于std::map是一个排序容器,所有键只能有一个可能的顺序,因此在没有重复项的情况下,插入顺序std::map无关紧要。类似地,内部的排序std::unordered_map由每个键的哈希决定,并且再次不依赖于插入顺序。

请注意,您将 a vector(顺序容器)打乱,然后将值复制到 amap中。不可能“洗牌” a map,因为您无法控制那里元素的位置。


推荐阅读