C++ 使用自定义排序对向量进行排序
这适用于具有A.num>B.num的cmp函数,但对于小于该值的所有值,它输出零,idk为什么感谢。我想知道我调用函数时是否做错了什么C++ 使用自定义排序对向量进行排序,c++,sorting,vector,stl,C++,Sorting,Vector,Stl,这适用于具有A.num>B.num的cmp函数,但对于小于该值的所有值,它输出零,idk为什么感谢。我想知道我调用函数时是否做错了什么 #include <bits/stdc++.h> using namespace std; typedef struct node { int num; }Node; #包括 使用名称空间std; 类型定义结构节点 { int-num; }节点; 当A.num bool cmpNode(Node A,Node B){ retur
#include <bits/stdc++.h>
using namespace std;
typedef struct node
{
int num;
}Node;
#包括
使用名称空间std;
类型定义结构节点
{
int-num;
}节点;
当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;
}
boolcmpnode(节点A、节点B){
返回A.num>n;
//std::向量v;
向量vec(n);
对于(int i=0;i>温度数值;
向量推回(温度);
}
排序(vec.begin()、vec.end()、cmpNode);
对于(int i=0;i cout我认为主要的问题是语句vector vec(n)
,它使用n
“empty”节点初始化向量,然后再添加另一个带有单个值的n
节点。因此,如果按升序排序,然后打印第一个n
节点,则很可能打印“empty”一个,即值为0
(开始时亮起)的一个
所以你主要应该写作
vector<Node> vec;
vec;
此外,如其他人所述,用于std::sort
的比较函数必须满足
严格弱序关系(cf):
应用于对象的函数调用操作的返回值
类型比较,当上下文转换为bool时,如果
调用的第一个参数出现在
此比较类型导致的弱排序关系,以及false
否则
这意味着,除其他要求外
对于所有a,comp(a,a)=false
让我们检查每个错误:
第1期:
您正在对已调整为n
项的向量调用push_back
。因此,在输入循环中,您只需在向量的末尾添加更多项,从而增加其大小
修正应如下所示:
vector<Node> vec;
bool cmpNode(const Node& A, const Node& B){
return A.num < B.num;
}
还要注意按引用而不是按值传递的用法。不要这样做:#include
-它不可移植,也不聪明。错误?你做错了什么。你的比较函数不正确。查找严格的弱顺序。如果A
和B
相等怎么办?哪一个在ot之前她?现在看到问题了吗?在C++程序中不需要<代码> TyBuffFrase——只需要代码> Stutt >。除了比较函数中的错误之外,看看你正在做的什么>代码> PuxSuffe。你的向量已经是代码> N< /Cl>元素,但是你又在推回去。早期错误。如果向量中存在重复项,程序仍将出现故障。需要更改排序比较功能(除了向量push_back
调用的问题)在VisualC++调试模式下运行程序,包括您的更改,在 STD::排序< /COD>调用由于不正确的比较函数。此外,您的答案实际上是函数声明,并且不创建<代码>向量< /代码>。谢谢,主要问题是我先前在向量中初始化了“n”值,同时r我按升序得到了0……我真的需要问一下,如果我按值或引用传递节点,会有什么不同?如果按值传递,则创建的是Node
的临时副本。如果Node
是一个昂贵的复制对象,则可能会降低程序的速度。此外,您有两个“main”问题。第一个是向量,但我在回答中指出的第二个问题,不仅是另一个主要问题,如果您没有意识到它,则很难检测到。如果您的向量包含重复项,那么您的程序将在排序中显示未定义的行为。