2011-07-22 20 views
2

我試圖創建一個模板函數,在Monte Carlo模擬中進行一些加權採樣。在下面。 input_data將是一個靜態分配的數組(即data [33]),一個動態分配的數組或一個向量。使用STL在模板函數內排序?

template <class myType> 
int init_roulette_calcs(myType &input_data, int inputlength, int *(&output_cdf), int highclassix, int weight) 
{ 
     sort(input_data, input_data + inputlength); //where the error occurs 

     //other code: 
     output_cdf = new int [inputlength]; 
     int k = 1; 
    for (int i = 0; i < inputlength; i++) 
    { 
     output_cdf[i] = k; 
     if (i+1 < highclassix) k++; 
     else k += weight; 
    } 
    return output_cdf[inputlength-1]; 
} 

該代碼不會編譯,因爲模板函數無法推斷調用進行排序的參數。這可能是一個愚蠢的問題,但我需要做些什麼才能確保這種排序可以正常工作?

Error 4 error C2784: 'std::_Vb_iterator<_Alloc> std::operator 
+(_Alloc::difference_type,std::_Vb_iterator<_Alloc>)' : could not deduce template argument for 
'std::_Vb_iterator<_Alloc>' from 'int' j:\rdm\lrgv_2011-07-21\lrgv_src\lrgv.h 398 

在此先感謝您的幫助。

回答

2

如果你把一個數組,數組名實際上是指向第一個元素,數組name + x是第th元素 - 所以你有這個部分是正確的。

問題是,這不是一個向量的情況,這就是爲什麼您需要使用.begin().end()函數來獲取指向這些位置的指針。

您可以嘗試通過拉取解除引用的開始/結束元素的地址進行排序 - 這可能會讓您將向量與數組相同。

+0

謝謝。我將不得不以不同的方式處理這些矢量。 – Joe

+0

您不應該將STL迭代器視爲原始指針,否則您的代碼可能會在某些實現中斷裂。 –

+0

我同意這種說法 - 矢量實現被定義爲在標準中使用連續內存,所以用指針算術來處理它們不應該產生問題。但是,對於STL容器來說,這確實不是一個好習慣 - 尤其是因爲在使用過程中迭代器可能會被容器操作無效化。 –

1
sort(&input_data, &input_data + inputlength); 
    ^^^   ^^^  

我希望你傳遞的參數實際上是對數組中第一個元素的引用。

+0

你能詳細一點嗎?我嘗試將數組的第一個元素作爲參數傳遞給函數,並且出現了很多錯誤。 – Joe

2

在你的代碼中,input_data是一個引用,但sort會需要它作爲指向數組開頭的指針。它應該是:

int init_roulette_calcs(myType input_data[], int inputlength, … 

雖然這將是適當的STL的使用做出這樣用戶可以提供任何形式的隨機存取模板開始和結束迭代器來代替。因此,你以後可以切換到一個載體或那種可以工作在任何其他容器......

template <class InputIterator> 
int init_roulette_calcs(InputIterator begin, InputIterator end, int *(&output_cdf), int highclassix, int weight) 
+0

感謝您的支持。兩個問題:(1)這似乎適用於動態和靜態分配的數組,但它不適用於stl向量。 (2)如果我將參數列表更改爲您所建議的參數,當我退出函數時,數據仍然會被排序嗎?我的印象是,如果像那樣通過價值傳遞,數據在退出函數後不會保持修改。這就是爲什麼我首先使用參考。 – Joe

+0

第一個版本確實是爲數組量身定製的,但第二個版本應該可以與任何具有隨機訪問的STL容器一起工作,因此包括向量。此外,您必須瞭解您通過價值或參考傳遞的內容。當您按值傳遞指針時,您傳遞指針的副本,而不是指向數組副本的指針。對於STL容器也是如此:當你通過值傳遞一個迭代器時,你的函數會看到一個迭代器的副本,它允許它與原始容器交互,而不是副本。 –

+0

感謝您的跟進。 – Joe