c++ - 为什么重建后的 map 类型与原始 map 类型不同?

标签 c++ types

考虑以下代码:

#include <iostream>
#include <typeinfo>
#include <map>


int main(int argc, const char* argv[]) {
    typedef std::map<int,float> testmap;
    typedef std::map<int,float> testmap2;
    typedef std::map<typename testmap::value_type::first_type, typename testmap::value_type::second_type> rebuiltMap;
    std::cout << "map samenes: " << std::is_same<testmap, rebuiltMap>::value << "\n";
    std::cout << "map samenes: " << std::is_same<testmap, testmap2>::value << "\n";
    std::cout << "original map type name " << typeid(testmap).name() << "\n";
    std::cout << "same     map type name " << typeid(testmap2).name() << "\n";
    std::cout << "rebuilt  map type name " << typeid(rebuiltMap).name() << "\n";
    std::cout << "original map valuetype " << typeid(testmap::value_type).name() << "\n";
    std::cout << "rebuilt  map valuetype " << typeid(rebuiltMap::value_type).name() << "\n";
}

这将产生以下输出:

map samenes: 0
map samenes: 1
original map type name St3mapIifSt4lessIiESaISt4pairIKifEEE
same     map type name St3mapIifSt4lessIiESaISt4pairIKifEEE
rebuilt  map type name St3mapIKifSt4lessIS0_ESaISt4pairIS0_fEEE
original map valuetype St4pairIKifE
rebuilt  map valuetype St4pairIKifE


为什么“重建的” map 类型与简单的 map 类型不同,尽管两者都具有相同的value_type?
背景:我想测试包含对的容器是否为 map ,是否具有类似的构造
std::is_same<std::map<typename Container::value_type::first_type,
                      typename Container::value_type::second_type>,
             Container>::value

最佳答案

这是因为std::map::value_typestd::pair<const Key, Value>,而不是std::pair<Key, Value>。这样做的原因是,永远不允许您修改映射中的一对 key 。

要使用value_type::first_type使重建后的 map 相同,您需要使用 const 删除该std::remove_const_t,例如

typedef std::map<std::remove_const_t<typename testmap::value_type::first_type>, typename testmap::value_type::second_type> rebuiltMap;

关于c++ - 为什么重建后的 map 类型与原始 map 类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58879778/

相关文章:

c++ - 调试循环 C++ undefined variable ,什么类型?霍格伦德

c++ - 类转换为类型

if-statement - Julia:检查向量是否是数字向量

c++ - 有没有办法将容器值传递给可变参数函数?

c++ - 为什么 unique_ptr 和 shared_ptr 不会使构造它们的指针无效?

haskell - OCaml 中的 haskell TypeError 的等效项

使用 where 嵌套函数定义中的 Haskell 范围

c# - C# 中的变体规则

c++ - 从可变参数继承并使用参数包: default constructor构造

c++ - Steamworks 和 SFML 程序退出时出现访问冲突