C ++向量排序给出0作为输出

时间:2018-07-16 08:01:06

标签: c++

我试图按升序对向量的内容进行排序,我知道该怎么做,但是当我调整它时,我得到的输出为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。

1 个答案:

答案 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元素分配内存。