有人可以解释这个paargraph的含义
配对的巨大优势在于它们具有内置的操作来比较它们自己。对比是第一到第二要素。 如果第一个元素 s 不等于,则结果将仅基于第一个元素的比较;只有当第一个元素相等时,才会比较第二个元素。对的数组(或向量)可以通过STL内部函数轻松排序。
因此
例如,如果要对整数点数组进行排序以使它们形成多边形,最好将它们放入向量<对>,其中向量的每个元素是{极角,{x,y}}。对STL排序功能的一次调用将为您提供所需的点数顺序。
我一直在努力了解这一点 Source
答案 0 :(得分:4)
考虑operator<
查看pair<A,B>
,这是一个类似于以下内容的类:
struct pairAB {
A a;
B b;
};
您可以将该段直接翻译成代码:
bool operator<(const pairAB& lhs, const pairAB& rhs) {
if (lhs.a != rhs.a) { // If the first elements are not equal
return lhs.a < rhs.a; // the result will be based on
} // the comparison of the first elements only
return lhs.b < rhs.b; // the second elements will be compared
// only if the first ones are equal.
}
或者,更抽象地思考,这就是词典排序的工作原理。想想你如何订购两个单词。你比较他们的第一个字母 - 如果他们不同,你可以停下来看看哪个更少。如果它们相同,那么你会转到第二个字母。
答案 1 :(得分:2)
第一段说对的排序如下:如果你有(x,y)和(z,w),你比较它们,那么它首先检查 x 是否小于(或大于) z :如果是,则第一对比第二对小(或大)。但是,如果 x = z ,那么它将比较 y 和 w 。如果对的第一个元素对于顺序比第二个元素更重要,则可以非常方便地对诸如对向量的排序进行排序。
第二段给出了一个有趣的应用。假设你站在飞机上的某个点上,并且有一个多边形包围着你。然后每个点将有一个角度和一个距离。但是考虑到这些要点,你怎么知道它们应该以什么顺序形成一个多边形(没有纵横交错)?如果以这种格式(角度,距离)存储点,那么你将获得免费的盘旋方向。这实际上相当简洁。
答案 2 :(得分:1)
STL对是将两个对象放在一起的容器。以此为例,
配对a,b;
第一个元素可以通过a.first访问,第二个元素可以通过a.second访问。
第一段告诉我们STL提供内置操作来比较两对。例如,您需要比较'a'和'b',然后首先使用a.first和b.first完成比较。如果两个值相同,则使用a.second和b.second进行比较。由于这是一个内置功能,您可以轻松地将它与STL的内部功能一起使用,如sort,b_search等。
第二段是如何使用它的一个例子。考虑一种您希望对多边形中的点进行排序的情况。您首先要根据它们的极角,然后是x坐标,然后是y坐标对它们进行排序。因此,我们使用{angle,{x,y}}对。因此,任何比较都将首先在角度上进行,然后提前到x值,然后是y值。
答案 3 :(得分:1)
如果要比较姓氏和名字对的简单示例,将会更容易理解。
例如,如果你有成对
{ Tomson, Ann }
{ Smith, Tony }
{ Smith, John }
并希望按升序对它们进行排序,你必须将它们相互比较。
如果比较前两对
{ Tomson, Ann }
{ Smith, Tony }
然后第一对的姓氏大于第二对的姓氏。所以没有必要比较名字。已经清楚这对
{ Smith, Tony }
必须在对
之前{ Tomson, Ann }
另一方面,如果你比较对
{ Smith, Tony }
{ Smith, John }
然后对的姓氏相等。所以你需要比较对的名字。由于约翰比托尼少,所以很明显这对
{ Smith, John }
将在对
之前{ Smith, Tony }
虽然姓氏(对的第一个元素)是相同的。
对于这对{ polar angle, { x, y } }
,如果两个不同对的极值相等,那么将比较{ x, y }
一对。因此,如果fird元素(x)等于将比较y(s)。
答案 4 :(得分:0)
实际上当你有一个矢量/数组对时,你不必在使用sort()函数时关心排序,你只需使用sort(v.begin(),v.end()) - &gt ;它将根据第一个元素自动排序,当第一个元素相等时,它们将使用第二个元素进行比较。查看链接中的代码和输出,一目了然。 https://ideone.com/Ad2yVG。{{1}}