这适用于具有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;
}
答案 0 :(得分:1)
让我们经历每一个错误:
问题1:
您正在对已经调整为Subscription
个条目的向量调用push_back
。因此,在输入循环中,您只需在n
的末尾添加更多项,从而增加其大小。
更正应如下:
vector
问题2:
vector<Node> vec;
的比较函数需要 strict-weak-order 。换句话说,当给定两个项目时,如果第一个项目在第二个项目之前,则返回std::sort
,否则您的函数必须唯一地指定哪个项目按排序顺序排在第一位,否则为true
。
您的比较功能违反了这一点,因为如果false
则返回true
,A == B
则会再次返回true
。那么B == A
或A
来B
之前是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