通过对元素的差异进行向量对排序 在C++中有任何方法,它会根据对值的差异来排序一对向量。例如,假设我有4对 1 3, 5 6, 2 3, 12 5,

通过对元素的差异进行向量对排序 在C++中有任何方法,它会根据对值的差异来排序一对向量。例如,假设我有4对 1 3, 5 6, 2 3, 12 5,,c++,sorting,C++,Sorting,所以,这对向量的差值是2,1,7,如果我按降序排序,那么排序的向量是 12 5, 1 3, 5 6, 2 3, 我希望你明白我的问题是什么。有没有办法这样对元素进行排序 我尝试了这种方法,根据第一个或第二个元素对元素进行排序。但这不是我的问题。我的问题是我需要根据差异进行排序 bool sortinrev(const pair<int,int> &a, const pair<int,int> &b){ return(a.first > b.

所以,这对向量的差值是2,1,7,如果我按降序排序,那么排序的向量是

12 5,
1 3,
5 6,
2 3,
我希望你明白我的问题是什么。有没有办法这样对元素进行排序

我尝试了这种方法,根据第一个或第二个元素对元素进行排序。但这不是我的问题。我的问题是我需要根据差异进行排序

bool sortinrev(const pair<int,int> &a, const pair<int,int> &b){
    return(a.first > b.first) ;
}


int main()
{
    vector< pair <int,int> > pq;
    for(int i=1; i<=4; i++){
        int x,y;
        cin >> x >> y;

        pq.push_back(make_pair(x,y));
    }

    sort(pq.begin(), pq.end(), sortinrev);

    for(int i=0; i<4; i++){
        cout << pq[i].first << " " << pq[i].second << endl;
    }


    return 0;
}
bool-sortinrev(常数对&a,常数对&b){
返回(a.first>b.first);
}
int main()
{
向量pq;
对于(inti=1;i>x>>y;
pq.推回(形成一对(x,y));
}
排序(pq.begin()、pq.end()、sortinrev);
如果您的容器是

std::vector<std::pair<int, int>> data;
std::矢量数据;
你可以把它归类为

std::sort(std::begin(data),
          std::end(data),
          [](std::pair<int, int> const& lhs, std::pair<int, int> const& rhs)
          {
              return std::abs(lhs.first - lhs.second) < std::abs(rhs.first - rhs.second);
          });
std::sort(std::begin(data),
标准::结束(数据),
[](标准:成对常数和左侧,标准:成对常数和右侧)
{
返回标准::abs(左一-左二)<标准::abs(右一-右二);
});

如果您想在升序和降序之间切换,只需相应地从

std::sort有一个重载,它接受可调用的比较

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
比如说

sort(begin(myvect), end(myvect), [](auto p) { /* comparison code */ });

(这需要c++14,您可能需要根据您的编译器版本进行修改)

标准库提供了一个数据结构
std::pair
和一个排序算法
std::sort
,您可以将定义顺序的自定义比较传递给该算法。请参阅以下代码,该代码定义了一个比较器,该比较器取两个
std::pair
,并根据它们的“绝对差异”对它们进行比较,以及如何使用它调用
std::sort
的代码。希望对您有所帮助

#include <iostream>
#include <vector>

int main()
{
    std::vector<std::pair<int,int> > v = {
        {1, 3},
        {5, 6},
        {2, 3},
        {12, 5}
    };

    // sort using a custom function object
    struct {
        bool operator()(const std::pair<int,int> &a, const std::pair<int,int> &b) const
        {
            return ( abs(a.first-a.second) > abs(b.first-b.second));
        }
    } differenceIsGreater;
    std::sort(v.begin(), v.end(), differenceIsGreater);
    for (auto a : v) {
        std::cout << "(" << a.first << "," << a.second << ")" << std::endl;
    }

    return 0;
}

C++可以把函数指针作为一个参数,只要传递一个函数来比较你想要的方法,我只知道如何根据第一个元素或基于第二个元素来排序,因为我不知道如何根据差异来排序,所以我张贴知道这个方法。然后我会尝试解决我的真正问题。<代码> >比较< <代码>变量>代码> SoTo()/Case>方法。请参阅链接@ SCOHE01在他的评论中。实际上有很多方法,因为这是计算问题,C++强大到足以实现几乎任何东西(尽管有时需要时间)在这种特殊情况下,C++提供了合理的简短和优雅的解决方案的内置支持(并且使用比较器变体,如CykkRAMER的答案)。但是,“C++中有没有任何方法”通常是自动的“是”。,除非你有一些非计算问题,或者一些非常低的操作系统/固件的东西。@ YasiRaHaMAN“最佳”在什么方式?短源?短二进制?最佳性能等等……在这种情况下你不能拥有全部,下面的答案是合理的妥协(简单的源代码,重新使用C++ STDLIB以预期的方式,合理的性能)。。您的代码非常适合这种情况,但如果OP不知道如何查找和找到此排序函数,我怀疑他是否理解lambdas。是否可以添加一个解释?或使比较器成为自己的函数?
#include <iostream>
#include <vector>

int main()
{
    std::vector<std::pair<int,int> > v = {
        {1, 3},
        {5, 6},
        {2, 3},
        {12, 5}
    };

    // sort using a custom function object
    struct {
        bool operator()(const std::pair<int,int> &a, const std::pair<int,int> &b) const
        {
            return ( abs(a.first-a.second) > abs(b.first-b.second));
        }
    } differenceIsGreater;
    std::sort(v.begin(), v.end(), differenceIsGreater);
    for (auto a : v) {
        std::cout << "(" << a.first << "," << a.second << ")" << std::endl;
    }

    return 0;
}
(12,5)
(1,3)
(5,6)
(2,3)