使用具有两个字段的结构体和使用pair的区别是什么?

36

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

6个回答

28

std::pair 提供了预先编写的构造函数和比较运算符。这使得它们可以被存储在像 std::map 这样的容器中,而无需编写例如拷贝构造函数或通过 operator <(例如 std::map 所要求的严格弱排序)来实现。如果您不编写它们,就不会犯错误(记住严格弱排序是如何工作的吗?),因此最可靠的方法就是使用 std::pair


1
我认为std::pair不提供任何成员的构造函数或运算符。你具体想到的是什么? - Manuel
1
@Manuel,事实上我刚刚检查了一下,pair提供了一个默认构造函数和一个模板复制构造函数。这很有道理——这样,在每种情况下,只要底层类型允许,pair就允许调用它。 - j_random_hacker
1
是的,但是原帖似乎暗示std::pair 神奇地 为底层类型生成了这些成员。奇怪的是这个答案被接受了。 - Manuel
1
措辞可能需要改进,但我认为AshleysBrain知道他/她在谈论什么。 - sellibitze
2
我认为这值得提一下std::make_pair(),在许多情况下非常方便,特别是与auto的新含义相结合时。 - sbi
显示剩余2条评论

23

std::pair提供了多个构造函数和运算符。

struct允许使用除firstsecond之外的命名字段,并且可以随时扩展。

尽可能使用struct。虽然可能会存在一些额外开销,但维护起来肯定更加容易。


26
对于维护评论点个赞。我曾与来自新泽西的一组工程师合作,他们试图使用STL做任何事情(我的意思是任何事情),而不是在设计指示时创建适当的类/结构,他们使用了STL容器。代码中到处都是“if (route.first.second[*iter].first) { ... }”。呃! - Don Wakefield

7

就内存分配和效率而言,没有什么区别——因为这正是std::pair的作用。


这就回答了我一直在想的问题,我突然意识到效率确实取决于你要做什么,所以有点过多的信息。我会接受AshleysBrain的问题来进一步思考... - Tamara Wijsman
2
没问题,但如果您对比较易用性感兴趣的话,询问这个问题会更有意义。Naveen和我都回答了所提出的问题。(不是在抱怨,只是说一下...) - j_random_hacker
嗯,似乎在我的评论中犯了一个严重的错别字。应该是“那就是我想知道的答案”。我选择了AshleysBrain的回答作为接受的答案,因为他很快并给出了一个很好的答案,就像你一样。选择起来很难,但我选择了对大多数人有益的那个。 - Tamara Wijsman
有没有源文件/头文件显示一对被编码为结构体? - Basj
@j_random_hacker:如果你找到了C++09标准,请告诉我 ;) - Lightness Races in Orbit
显示剩余2条评论

2

如果您想要自己的名称的好处,但又想利用std::pair(或任何其他对象)的优势,则可以使用“using”(从c ++ 11开始)。 您可以在命名空间或类声明中设置此选项。

实际上,这就是我许多类的起点...

using myPair = pair<int,string>;

参见C++ reference获取更多文档。


1
虽然如此,这仍然存在.first.second的问题。 - infinitezero
@infinitezero - 没错。当我开始看到first.second.first,或者需要添加函数时,我知道是时候将别名转换为结构体了。 - Konchog

2

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


你使用的是哪个STL实现? - Benoît
我正在使用VC9编译器附带的那个。 - Naveen
1
是的,这遵循了常见的约定,即如果用户定义的类型公开数据成员(例如pair中的firstsecond),那么它必须是一个struct - Manuel
可以是一个在public部分声明了firstsecondclass。根据接口,firstsecond成员必须是公共的;并没有说明它必须是一个class还是struct - Thomas Matthews
2
@Thomas Matthews:在 struct X { ... };class X { public: ... }; 之间,从语义上讲没有任何区别。(与 C# 不同。) - j_random_hacker
这似乎与Basj的答案相矛盾。 - Keith M

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接