如何在C++中存储一对数字?

26

我正在学习C++,现在正在编写一个需要输出整数对列表的程序。

如何处理这个问题?因为学校的Linux计算机上没有可用的Boost库,所以我不认为可以使用boost::tuple。

有什么建议吗?


1
如果您有足够新的支持tr1的g++版本,则boost::tuple将作为std::tr1::tuple包含在内;正如下面答案中其他人所指出的那样,对于一对值,您可以使用std::pair - James McNellis
3个回答

31

请看 std::pair<object, object>

编辑:

它是标准C++的一部分,属于STL(标准模板库)。它是一组漂亮的数据结构,是通用的(即可用于存储任何C++对象类型)。这个特定结构用于存储一对数字。它基本上是一个带有成员"first"和"second"的对象,这些成员指向您在其中存储的第一个和第二个对象(任何类型!)。

因此,只需声明一个pair<int, int>数组,或者更好地使用另一个STL类型称为“vector”来创建动态大小的pair<int, int>列表:vector<pair<int, int>> myList

嘿,你知道吗!一个动态大小的对列表已经存在了,它叫做映射!使用它就像这样简单:#include <map>,然后声明一个map<int, int> myMap !!!

编辑:

是的,正如指出的那样,映射将一个对象映射到另一个对象,因此您不能具有重复的左侧值。如果可以接受这一点,那么映射就是您要寻找的东西,否则请坚持使用pair的vector...或查看multi-map。

std::mapstd::multimap


请注意,输出这对值将不会由cout处理(就像intdouble一样)——您需要单独处理它。 - dirkgently
5
在C++98和C++03中,必须使用vector<pair<int, int> >(注意末尾的空格!),因为>>会被解析成“右移”。这个问题将在C++0x中得到修复。 - ephemient
@ephemient 有趣啊...我敢打赌这会产生一个非常有用的编译器错误。 ;) - Nick Bolton
6
-1 是因为 map 不同于处理值对。Map 所做的就是它的名字所说的:将一个键值映射到另一个值。因此,如果使用 map,左值不能重复。 - Bruno Brant
1
@Bruno 是的,你可以 - std::multimap - anon
2
std::mapstd::multimap都不是“一对列表”。列表保留它们的顺序,而映射集合则不保留。 - Ben Voigt

19

使用 std::pair 吗?

#include <utility>
#include <iostream>

int main() {
    std::pair <int, int> p = std::make_pair( 1, 2 );
    std::cout << p.first << " " << p.second << std::endl;
}

你可以创建一个pair的向量:
typedef std::pair <int, int> IntPair;

...

std::vector <IntPair> pairs;
pairs.push_back( std::make_pair( 1, 2 ) );
pairs.push_back( std::make_pair( 3, 4 ) );

你会建议使用std::pair而不是map吗? - Mithrax
Mithrax,map只是对pair的包装器。它在内部使用pair代码。 - Mahmoud Al-Qudsi
1
@Mithrax 这取决于您想要对这些pair做什么。如果其中一个是键,另一个是值,那么您应该使用std::map,实际上它是使用std::pair实现的。 - anon
3
计算机大师,map 不仅仅是对 pair 的封装。如果说有什么的话,它更像是对红黑平衡二叉树的封装。 - anon
当然。与vector<pair>相比,它将是对pair的数组列表包装器。关键是,归根结底,你不能建议使用pair代替map,因为它们是不同的东西。其中一个是表示元组的基本数据结构,而另一个则使用元组来构建更大的结构 :)请记住,OP是C++的初学者。 - Mahmoud Al-Qudsi
很好的回答,我只想补充一点,在 C++11 中,创建一对向量非常容易:std::vector<std::pair<int, int>> pairs = {{1,2}, {3,4}, {5,6}}; - Akavall

9

虽然std::pair是使用最佳方案,但我惊讶地发现没有人提到stl之前的解决方案:

struct Pair {
    int first;
    int second;
};

令人担忧的是,有些人认为他们需要增强技术来解决如此微不足道的问题。


2
Pre-STL就像是在预先标准化时代,上个千年?你想知道为什么没有人提到它吗?此外,您的代码缺少std::pair的几个重要/好用的特性,因此甚至不能用于说明目的。实际上,提到这种方法的目的是什么? - Konrad Rudolph
1
Konrad,我确实说过 std::pair 更好。 我不明白为什么我的代码不能用于说明目的。 我的主要观点是有时人们会忘记简单的解决方案。 - shura
2
如果你只是想学习C++,这绝对是最好的答案。它简单、不复杂,并且很容易适应其他问题。一旦熟悉了结构体,就很容易教会如何适应类并为诸如MyObject.SecondValue之类的事物提供方法。再加上上面提到的数组建议(即Pair[] MyValues),真的没有理由不接受这个答案。 - nathanchere
我完全同意nathanchere的观点,从教学的角度来看,这是最好的答案。无论生产代码是否定义了新类型,std::pair已经存在,但应该先向初学者介绍如何完成它。 - Darryl
1
请原谅我可能的无知;在哪里说到pair与Boost有关系了?我指的是这个:人们认为需要使用Boost解决如此微不足道的问题,这让人担忧。 STL!= Boost? - Super Cat

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