代码之家  ›  专栏  ›  技术社区  ›  Sasha

复杂STL映射时的命名约定是什么?

  •  12
  • Sasha  · 技术社区  · 17 年前

    typedef std::map<SomeClass*, SomeOtherClass>  [SomeStandardName>]
    typedef std::map<SomeClass*, std<SomeOtherClass> >  <[SomeStandardName]
    

    2) 您通常将typedef:头文件放在全局、类本地的什么位置?

    typedef map<string, SomeClass *> IDToSomeClassMap;
    typedef map<string, SomeClass *> DescriptionToSomeClassMap;
    

    谢谢


    编辑#1

    typedef map<int, string> IdToDescriptionMap
    

    typedef map<int, string> IdToDescription
    

    常见的做法是什么?

    9 回复  |  直到 15 年前
        1
  •  18
  •   Not Sure    17 年前

    我更喜欢以下惯例:

    typedef std::map< Foo, Bar > FooToBarMap
    

    我有意避免对迭代器进行类型定义,我更喜欢将它们显式地称为:

    FooToBarMap::const_iterator
    

    因为迭代器已经是一个 事实上 标准类型名。我发现,在浏览代码时,footobarmacconstite实际上不太清晰。

        2
  •  2
  •   lothar    17 年前

    对这些名字没有普遍同意的规则。我通常做的是使用带有Map后缀的“value”类的名称。在你的例子中,那将是 另一类 然后你就可以用 某类 .

        3
  •  2
  •   Head Geek    17 年前

    问题的第二部分对我来说是最有趣的。我宁愿把 typedef 在使用它们的类中,当它们有一个逻辑位置时,即使它们在其他类中使用。但这会导致前向声明出现一些问题(我们大量使用前向声明来提高编译速度)。

    例如,在最近的一个项目中,我们有一个名为 Io Point ,这使得代码可读性非常强--一个 Io::Point 木卫一 类,即使我们所需要的只是声明 Io::点 ,因为(据我所知)无法向前声明在向前声明的类中的类型。

    在这种情况下,我们最终以两种方式完成。我们创建了一个全球 IoPoint 类型定义 Io::点 这样我们已经编写的代码就不需要修改了。这不是最漂亮的答案,但它完成了任务。

    描述测量 足够描述性,并且与现有名称不冲突,我们将经常使用它。

    我们通常不会为迭代器创建typedef,因为简单使用它很容易(而且可读性很强) Type::iterator Type::const_iterator . 也就是说,我们 有时,如果类型名太长以至于 使代码看起来太“笨重”。(不知道有什么更好的说法,但你可能知道我的意思。)

        4
  •  1
  •   JaredPar    17 年前

    我不知道是否有关于这个主题的正式规则,但我通常在最适合项目使用的位置添加type def。

    • 如果typedef仅在一个类中使用,则将typedef添加到类定义中
    • 如果typedef被几个不相关的类使用,则将其添加到命名空间范围级别的头文件中

    至于typedef'd类型的实际名称。我把它命名为对typedef有意义的任何东西。我没有给typedef命名任何特殊约定,比如前缀为_t或任何类似于这些行的东西。例如

    typedef stl::map<stl::string,Student> NameToStudentMap;
    
        5
  •  0
  •   dirkgently    17 年前

    无,请记住命名标识符的一般规则(无 _ 首先,等等)。此外,如果您的组织有一个编码指南,那么最好坚持它。

    通常,在定义自己的模板类时,如果没有typedef,它会变得很混乱——所以我会在那里创建它们作为方便的快捷方式。然而,如果它真的是一堆课程,我宁愿在 namespace 数量

        6
  •  0
  •   leander    17 年前

    我们在我的工作场所使用以下工具:

    typedef std::map WhateverMap;
    typedef WhateverMap::iterator WhateverIter;
    typedef WhateverMap::const_iterator WhateverCIter;
    

    就地点而言,情况各不相同。如果它是特定于类的,那么它可能位于Impl结构中,也可能位于类声明的受保护或私有区域中。如果它更通用(跨文件使用,在API中使用),我们将它放在单独的“FooTypes.h”样式的标题中。

    请注意,由于有时更改底层类型是很常见的,因此我们可以使用“WhateverCollection”而不是“WhateverVec”或“WhateverList”。根据所需的内存占用和性能特征,将“WhateverList”实际类型化为向量或slist并不少见。

        7
  •  0
  •   bayda    17 年前

    兴趣问题:
    我查看了boost,我发现他们没有任何全球规则,但大多数使用的是惯例

    typedef std::map< key, value > some_domain_specific_name_map;
    

    typedef std::map< key, value > some_domain_specific_name_map_type;
    

    为value_类型或迭代器生成typedef也是一个很好的实践,通常它们与map同名,但结尾为_value_类型,_迭代器。

        8
  •  0
  •   aJ.    17 年前

    前任:

    typedef std::vector<ClassCompStudent*> StudentCollection;
    
    typedef std::map<std::string /*id*/, ClassCompStudent* /*pStudent*/>  IDToStudentMap;
    

    此外,我还将它们定义为创建对象的类头中的public。这使我能够在不破坏客户机代码的情况下更改容器类型。

    class Test
    {
    public:
        typedef std::vector<ClassCompStudent*> StudentCollection;
    
        /* Users of Test need not know whether I use vector or list for 
            storing students. They get student collection and use it*/
        bool getStudents(StudentCollection& studentList) const;
    
        void print()
        {
            //do printing
        }
    private:
    
        StudentCollection m_StudentList;
    };
    
    bool function(const Test& testObj)
    {
        //If StudentCollection gets changed to list, this code need not be changed.
        StudentCollection aCollection;
        testObj.getStudents(aCollection);
        std::for_each(aCollection.begin(), aCollection.end(), std::mem_fun(&Test::print));
    }
    
        9
  •  0
  •   Mykola Golubyev    17 年前

    用“地图”或“向量”这个词来表示无用的符号。这些词与实现有关,而与业务模型无关。

    typedef std::vector<std::string> List;
    typedef std::set<std::string> List;
    

    这两个都是字符串列表。这是真的。

    typedef std::map<std::string, Object> List;
    or  
    typedef std::map<std::string, Object> NamedList;
    

    我的观点是不要使用匈牙利符号。