2014-12-07 61 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在該函數內被修改,但是這些更改不會傳播到原始向量,而只會傳播到函數範圍內的一個向量。