当两个 std::map 对象相同时

When two std::map objects are identical

本文关键字:map 对象 std 两个      更新时间:2023-10-16

我有两个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因此无论以什么顺序填充,两张地图都是相等的。但能保证如此吗?如果是这样,你能解释一下为什么吗?

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

  • 顺序容器可让您决定元素的位置
  • 关联容器本身确定元素的位置

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

请注意,您随机播放vector(顺序容器(,然后将值复制到map中。不可能"洗牌"map,因为您无法控制那里元素的位置。

...因此,无论按什么顺序填充,两张地图都是相等的。但能保证如此吗?

是的,因为std::map是一个排序的关联容器(通常实现为二叉树(,所以它的元素保证被排序(无论其实现如何(。