使用自定义排序排序矢量

时间:2017-07-04 21:25:18

标签: c++ sorting vector stl

这适用于具有A.num> B.num的cmp函数,但是对于小于它输出所有值的零,idk为什么谢谢。我想知道我在调用函数时是否做错了吗?

#include <bits/stdc++.h>
using namespace std;

typedef struct node
{
    int num;
}Node;

这在A.num时出错

bool cmpNode(Node A,Node B){
    return A.num<=B.num;
}

int main(){

    int n;
    cin>>n;

    //std::vector<char> v;
    vector<Node> vec(n);

    for (int i = 0; i < n; ++i)
    {
        Node temp;//    =new Node;
        cin>>temp.num;
        vec.push_back(temp);

    }

    sort(vec.begin(), vec.end(),cmpNode);

    for (int i = 0; i < n; ++i)
    {
        cout<<vec[i].num<<" ";
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

让我们经历每一个错误:

问题1:

您正在对已经调整为Subscription个条目的向量调用push_back。因此,在输入循环中,您只需在n的末尾添加更多项,从而增加其大小。

更正应如下:

vector

问题2:

vector<Node> vec; 的比较函数需要 strict-weak-order 。换句话说,当给定两个项目时,如果第一个项目在第二个项目之前,则返回std::sort,否则您的函数必须唯一地指定哪个项目按排序顺序排在第一位,否则为true

您的比较功能违反了这一点,因为如果false则返回trueA == B则会再次返回true。那么B == AAB之前是B吗?

当然,如果向量中有重复的项目,这将无法正常工作并完全抛弃排序算法(这是Visual C ++调试运行时检查你是否有一个有效的比较函数 - 比较函数被调用两次并检查两次调用的返回值。

更正应如下:

A

还要注意通过引用而不是按值传递的用法。

答案 1 :(得分:0)

我认为主要问题是声明vector<Node> vec(n),它使用n&#34;空&#34;初始化向量。在您另外添加具有单个值的另一个n节点之前的节点。因此,如果您按升序排序,然后打印第一个n节点,则很可能会打印&#34;空&#34;那些,即价值为0的那些(在一开始就闪耀起来)。

所以主要是你应该写

vector<Node> vec;

此外,正如其他人所说,用于std::sort的比较函数必须满足 严格的弱有序关系(参见cppreference.com):

  

应用于对象的函数调用操作的返回值   类型比较,当上下文转换为bool时,产生true,如果   调用的第一个参数出现在严格的第二个参数之前   此比较类型引起的弱排序关系,以及false   否则。

除其他要求外,这意味着......

  

对于所有a,comp(a,a)== false