2014-12-07 62 views
1

我试图让此代码正常工作。出于某种原因,算法不会被调用,或者没有以正确的方式实现。如果我运行编译得很好的代码,我会返回相同的未分类输入。我尝试了一些通过矢量的东西,但我不确定这个问题在哪里。将向量传递给函数

#include <iterator> 
#include <iostream> 
#include <algorithm> 
#include <sstream> 
#include <vector> 





void shift_down(std::vector<int> v, int i, int s){  
     while (i*2 + 1 < s) { 
      int child = 2*i + 1; 
      if ((child + 1 < s) && v[child] < v[child+1]) child++; 
     if (v[i] < v[child]) { 
      std::swap(v[i],v[child]); 
      i = child; 
     }   
     else    
      return;  
    } 
} 

void heap_sort(std::vector<int> v, int s){   
    for (int i = s/2; i >= 0; i--) { 
     shift_down(v, i, s);  
    } 
    while (s-1 > 0) { 
     std::swap(v[s-1], v[0]); 
     shift_down(v, 0, s-1); 
     s--; 
    } 
} 


int main(){ 
    std::string line; 
    std::vector<int> vec; 

    std::cout << "Please enter numbers seperated by spaces:" << std::endl; 
    std::getline(std::cin, line); 
    std::istringstream stream(line); 

    std::copy(std::istream_iterator<int>(stream), 
    std::istream_iterator<int>(), 
    std::back_inserter(vec)); 

    int size = vec.size(); 

    heap_sort(vec,size); 

    std::copy(vec.begin(),vec.end(), 
      std::ostream_iterator<int>(std::cout, "\t")); 
    std::cout<<"\t"<<std::endl; 

    return 0; 
} 
+2

以引用为参照向量,修改函数本地副本。 – Borgleader 2014-12-07 02:18:56

+0

感谢您的提示,它现在有效。 @Borgleader – user3697516 2014-12-07 03:05:53

回答

1

参照干脆把向量:

void heap_sort(std::vector<int>& v, int s){ 
//       ^

void shift_down(std::vector<int>& v, int i, int s){ 
//       ^

Live demo

您正在复制传入向量到v说法。 v在该函数内被修改,但是这些更改不会传播到原始向量,而只会传播到函数范围内的一个向量。