Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用自定义排序对向量进行排序_C++_Sorting_Vector_Stl - Fatal编程技术网

C++ 使用自定义排序对向量进行排序

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

这适用于具有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){
    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;icout我认为主要的问题是语句
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”问题。第一个是向量,但我在回答中指出的第二个问题,不仅是另一个主要问题,如果您没有意识到它,则很难检测到。如果您的向量包含重复项,那么您的程序将在排序中显示未定义的行为。