STL 排序不能很好地排序我的 vector<pair<int,int>>

Posted

技术标签:

【中文标题】STL 排序不能很好地排序我的 vector<pair<int,int>>【英文标题】:STL sort doesn't sort my vector<pair<int,int> > well 【发布时间】:2015-07-30 10:52:05 【问题描述】:

我正在尝试解决一个更复杂的算法问题,并且部分要求涉及对一些整数对进行排序。

这是我的代码(我已经评论了与我的问题无关的部分)

#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

ifstream fin("ai.in");
ofstream fout("ai.out");

#define MaxN 1001
#define MaxK 150001
//
//int n;
//int t1, t2, s1, s2, s3, s4, r1, r2, r3, r4;
int k;
int x,y;

vector<pair<int,int> >v(MaxK);

int main()

//    fin >> n;
//
//    fin >> t1 >> t2 >> s1 >> s2 >> s3 >> s4 >> r1 >> r2 >> r3 >> r4;

    fin >> k;

    for ( int i = 1; i <= k; ++i )
    
        fin >> x >> y;
        v[i].first = x;
        v[i].second = y;
    

    sort(v.begin() + 1, v.begin() + n + 1);

    for ( int i = 1; i <= k; ++i, fout << '\n' )
        fout << v[i].first << ' ' << v[i].second;

    fin.close();
    fout.close();
    return 0;

对于这个输入

8
1 2
2 3
2 5
4 2
6 2
2 2
2 4
5 2

我得到这个输出

1 2
2 2
2 3
2 5
4 2
6 2
2 4
5 2

这当然是错误的,因为您可以在输出末尾附近看到 2 4 对。 那么我该如何解决呢?

【问题讨论】:

不编译:行sort(v.begin() + 1, v.begin() + n + 1);n: undefined identifier std::sort(v.begin(), v.end())。这意味着什么?试着把它读成英文。它从“开始”到“结束”“排序”。就是这么简单。 v.begin() + 1v.begin() 完全不同。 糟糕,我输入的是 n 而不是 k。现在一切正常。谢谢。 免费建议:在您认为 STL 或任何其他库有问题之前先在代码中找到错误。 【参考方案1】:

这部分程序

fin >> k;

for ( int i = 1; i <= k; ++i )

    fin >> x >> y;
    v[i].first = x;
    v[i].second = y;


sort(v.begin() + 1, v.begin() + n + 1);

不清楚n是什么变量

应该如下所示

fin >> k;

if ( MaxK < k ) k = MaxK;

for ( int i 0 1; i < k; ++i )

    fin >> x >> y;
    v[i].first = x;
    v[i].second = y;


sort( v.begin(), v.begin() + k );

最后一条语句也可以这样写

sort( v.begin(), std::next( v.begin(), k ) );

前提是标题 &lt;iterator&gt; 将被包括在内

您也可以设置 [1, k + 1 ) 之类的范围,但从您的帖子中不清楚为什么不应该填充向量的第一个元素。

由于设置了无效的范围上限,您似乎得到了意想不到的结果。

【讨论】:

【参考方案2】:

您可能提供了错误的 end 迭代器进行排序,因为您可以看到输入中的最后两个条目与输出中的相同 - 排序根本不将它们包括在排序中。

std::sort 将对对进行排序,首先按第一个元素 - 如果两者相等,它将比较第二个。

【讨论】:

以上是关于STL 排序不能很好地排序我的 vector<pair<int,int>>的主要内容,如果未能解决你的问题,请参考以下文章

C++STL二维vector指定位置排序

STL:在海量数据中排序和搜索

STL基础--算法(排序)

使用STL对字符串进行排序

[C++STL]常用排序算法

stl中常用的排序算法