我试图按升序对向量的内容进行排序,我知道该怎么做,但是当我调整它时,我得到的输出为0。我试图按降序进行排序,并且得到了在这种情况下,正确答案。
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Edge {
public:
int node1;
int node2;
int edge_weight;
Edge()
{}
Edge(int n1,int n2,int w)
{
node1=n1;
node2=n2;
edge_weight=w;
}
};
bool mycompare(Edge e1,Edge e2)
{
return e1.edge_weight<e2.edge_weight;
}
int main()
{
int V, E;
cin >> V >> E;
vector<Edge> v(E);
int *parent=new int[V];
for(int i=0;i<V;i++)
{
parent[i]=i;
}
int count=0;
for(int i=0;i<E;i++)
{
int s1,s2,weight;
cin>>s1>>s2>>weight;
Edge e(s1,s2,weight);
v.push_back(e);
}
sort(v.begin(),v.end(),mycompare);
for(int i=0;i<E;i++)
{
cout<<v[i].node1<<" "<<v[i].node2<<" "<<v[i].edge_weight<<endl;
}
return 0;
}
输入:
4 4
0 1 3
0 3 5
1 2 1
2 3 8
降序输出:
2 3 8
0 3 5
0 1 3
1 2 1
升序输出:
0 0 0
0 0 0
0 0 0
0 0 0
此处,降序输出正确,但升序 我将所有节点的值都设为0。
答案 0 :(得分:3)
vector<Edge> v(E);
创建一个包含E
个元素(全部0
个)的向量,然后v.push_back(e);
将在零元素之后添加新元素。因此,您有一个包含2*E
个元素的向量,第一个E
被置零,第二个E
是您想要的元素。如果您对它们进行升序排序,则零元素优先。
通过遍历整个矢量来打印它们,您将看到它:
for(const auto& i: v)
{
cout<<i.node1<<" "<< i.node2<<" "<< i.edge_weight<<endl;
}
要解决您的问题,只需不要创建包含E
个元素的向量,而是创建一个空的vector<Edge> v;
元素。
如果要提高性能,可以使用v.reserve(E);
为E
元素分配内存。