当两个 std::map 对象相同时
When two std::map objects are identical
我有两个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
是一个排序的关联容器(通常实现为二叉树(,所以它的元素保证被排序(无论其实现如何(。
相关文章:
- C++ 使用枚举类对象分配 std::map 值
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- 当两个 std::map 对象相同时
- 如何在声明时将对象插入 std::map
- 在 std::map 中插入对象时构造函数中变量的地址
- 将对象存储在 std::map 中
- 当对象为值时访问实例方法<map>
- 向 std::map 添加对象和自定义比较<>
- 将STD :: MAP对象传递到线程
- C++ 堆栈中的类对象作为 Map 的值插入
- Qt Qml,在iOS上将map(OSM Mapbox Mapboxgl)嵌入到QQuickWidget C++对象中
- 带有 std::map 的 c++ 结构是拥有动态数据对象的好设计吗?
- 使用 protobuf 对象作为 std::map 中的键
- 将QML数组和MAP/对象类型与C 区分开
- 将没有默认 ctor 的对象插入到 std::map
- C++填充一个std::map创建不必要的对象
- C++ std::map 如何在每次调用类对象时获取新的 map 对象
- c++和java中map对象的最大大小是多少?
- 如何将 Eigen::Map 对象用于 Eigen::EigenSolver