代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

STD::在它里面有Type类型的映射?

  •  1
  • Tony The Lion  · 技术社区  · 14 年前

    在C++中做下面的操作是个好主意:

    typedef std::map<std::string, boost::any> MyVals;
    
    // Is the following typedef'd type inside a map a good idea?
    typedef std::map<std::string, MyVals> TagValues;  
    

    这些映射将大量用于顺序插入和删除。

    6 回复  |  直到 14 年前
        1
  •  7
  •   Vlad    14 年前

    对代码中常用的类型进行typedefing没有什么不好的。

    typedef只存在于语法级别,不会对生成的代码进行任何更改。此外,一个精心选择的名字将使可读性更好。

    只是比较一下

    std::map<std::string, std::map<std::string, boost::any>::const_iterator it =
             tagValues.find(x);
    

    VS

    TagValue::const_iterator it = tagValues.find(x);
    
        2
  •  3
  •   Steve Townsend    14 年前

    使用没有什么问题 typedef 很好,事实上,如果您以后需要替换底层容器。

    有件事总是让我担心嵌套 map s是为了确保键和值的复制构造是有效的,或者使用单实例存储( shared_ptr 例如)以避免这种情况。尤其是如果你做了大量的插入/移除,内务管理的成本可能会很高。

        3
  •  1
  •   ssube    14 年前

    如果你想轻松改变 MyVals 后来。在我看来,从我听到/看到/阅读的内容来看,这正是typedef的用途。

    但是,这是需要注意的,您需要确保从不将typedef更改为在 std::map . 如果你这样做了,你会遇到一些问题,而且要找到问题所在可能会有点痛苦。

        4
  •  1
  •   Armen Tsirunyan    14 年前

    你看到了什么坏东西?我一个人肯定会用typedef来表示任何需要输入的东西…

        5
  •  1
  •   winwaed    14 年前

    没问题。

    STL类定义很快就会变得复杂,因此使用typedef定义集合、迭代器等通常很有用。

        6
  •  1
  •   Valentin Heinitz    14 年前

    typedef没有什么问题,但是如果您说myvals将被大量插入和删除,那么在stl容器中具有这样的haevy数据类型可能会很慢,因为涉及到赋值操作符。我会考虑将myvals包装在boost::shared_ptr中。