【问题标题】:What is the difference between using a struct with two fields and a pair?使用具有两个字段和一对的结构有什么区别?
【发布时间】:2011-01-15 05:22:16
【问题描述】:

使用具有两个字段和一对字段的结构在内存分配和效率方面有什么区别?

【问题讨论】:

    标签: c++ struct std std-pair


    【解决方案1】:

    std::pair 提供预先编写的构造函数和比较运算符。这也允许它们存储在像 std::map 这样的容器中,而无需编写,例如,复制构造函数或通过operator < 进行的严格弱排序(如std::map 所要求的)。如果你不写它们就不会出错(还记得弱排序是如何工作的吗?)所以使用std::pair 更可靠。

    【讨论】:

    • 我不认为 std::pair 为其成员提供任何构造函数或运算符。你到底在想什么?
    • @Manuel,其实我刚刚查过了,果然,pair 提供了一个默认的 ctor,以及一个模板复制 ctor。有道理 - 这样,在每种情况下,pair 允许在 & 仅当底层类型允许时调用它。
    • 是的,但 OP 似乎暗示 std::pair 神奇地 为基础类型生成了这些成员。奇怪的是这个答案被接受了。
    • 措辞本可以更好一些,但我认为 AshleysBrain 知道他在说什么。
    • 已编辑以尝试澄清措辞。
    【解决方案2】:

    就内存分配和效率而言,没有区别——因为std::pair就是这样。

    【讨论】:

    • 这就是我想知道的答案,我突然意识到效率真的取决于你会做什么,所以信息有点太多了。我将接受 AshleysBrain 的问题进一步思考......
    • 没问题,但如果您对此感兴趣,那么询问比较易用性会更有意义。我和 Naveen 都回答了上述问题。 (不是抱怨,只是说……)
    • 嗯,我的评论中似乎有一个严重的错字。 “这就是我想知道的答案”应该是。我给了 AshleysBrain 接受的答案,因为他很快并且给出了一个很好的答案,就像你一样。这很难选择,但我选择了受益最多的那个。
    • 是否有源文件/标头显示一对在内部编码为结构?
    • @Basj:我手头没有 C++09 标准,但我相信这是标准要求的。
    【解决方案3】:

    在内存分配或效率方面没有区别。其实在我使用的STL实现中pair被定义为struct pair

    【讨论】:

    • 你使用的是什么 STL 实现?
    • 我用的是VC9编译器自带的。
    • 是的,这符合通用约定,即如果用户定义的类型公开公共数据成员(如 pairfirstsecond 一样),那么它必须是 @987654325 @.
    • 可能是 class,在 public 部分中声明了 firstsecond。根据界面,firstsecond成员必须是public;没有说明它必须是class 还是struct
    • @Thomas Matthews:struct X { ... };class X { public: ... }; 之间没有任何语义差异。 (例如,与 C# 不同。)
    【解决方案4】:

    std::pair 带有许多构造函数和运算符。

    struct 允许命名字段(firstsecond 除外)并且随时可以扩展。

    尽可能选择struct。它可能会涉及一些开销,但肯定更容易维护。

    【讨论】:

    • +1 用于维护评论。我与来自新泽西州的一组工程师一起工作,他们试图用 STL 做所有事情(我的意思是所有事情),而不是在设计指示时创建适当的类/结构,而是使用 STL 容器。代码中到处都是“if (route.first.second[*iter].first) { ... }”。啊!
    【解决方案5】:

    正如std::pair<int, int> vs struct with two int's 中所述,结构可能会快一点,因为没有进行初始化。

    【讨论】:

      【解决方案6】:

      正如上面没有提到的,如果你想要你自己名字的好处,但 std::pair (或任何其他对象)的优点,你可以使用“使用”(从 c++11 开始) .您可以在命名空间或类声明中设置它。

      事实上,这就是我现在有多少课程开始...

      using myPair = pair<int,string>;
      

      参见。 C++ reference. for more documentation.

      【讨论】:

      • 虽然是这样,但这仍然存在.first.second“问题”。
      • @infinitezero - 没错。当我开始看到 first.second.first,或者需要添加函数时,我知道是时候将别名转换为结构了。
      猜你喜欢
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多