STL排序不对我的向量<pair <int,int>&gt;进行排序好

时间:2015-07-30 10:52:06

标签: c++ sorting stl

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

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

#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对,这当然是错误的。 那我怎么解决这个问题呢?

2 个答案:

答案 0 :(得分: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 ) );

如果将包含标题<iterator>

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

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

答案 1 :(得分:0)

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

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