2012-05-03 96 views
-1

我有代碼作爲這樣:使用std :: random_shuffle用的std ::陣列

typedef intptr_t ptr_t; 

const int num_elements = 100; 
ptr_t *pstr = (ptr_t *)malloc(sizeof(ptr_t) * num_elements); 
std::array<ptr_t,num_elements> *parray = new (pstr) std::array<ptr_t,num_elements>; 

我想能夠洗牌元件1至num_elements-2,所以我想使用std ::洗牌。

auto s = parray->begin()++; 
auto e = parray->end()--; 
std::random_shuffle (s, e); 

我收到一個投訴,指出沒有重載函數。 我感到很蠢,因爲我無法看到我做錯了什麼。我該如何做到這一點?

編輯:由於答案和反饋,它已經變成

auto s = parray->begin(); 
s++; 
auto e = parray->end(); 
std::random_shuffle (s, e); 

然而,關於「汽車E」我得到:「自動」在間接的水平不同於「詮釋*」

+0

我從來沒有見過將迭代器算法應用於'end()'之前。另外,你想''''''''而不是'begin()'的臨時。 – chrisaycock

+0

快速提示:'++'和'--'對's'和'e'的值沒有影響,因爲它在賦值後發生。此外,它是在臨時完成的,然後立即丟棄。 – dasblinkenlight

+0

你爲什麼這麼做很複雜?只需使用'new []'。 – zvrba

回答

5

在回答你的直接問題時:我相信你的錯誤是使用後增量運算符,它在增量前返回它們的原始值。由於std::array迭代器是基本指針,嘗試

auto s = parray->begin() + 1; 
auto e = parray->end() - 1; 

編輯: 現在,作爲休息。你爲什麼這樣做?您是否考慮過使用 std::vector<int> arr(100)來創建100個元素的動態數組?它具有類似的功能,不需要直接操作指針?編輯2:在閱讀你的評論之後,我意識到問題在於你試圖洗牌一個數組作爲指針。在那種情況下,我根本不會做新的放置。假設你有指針pstr,這應該工作。

std::random_shuffle(pstr +1, pstr + num_elements - 1); 

這是可行的,因爲數組中的簡單指針將作爲隨機訪問迭代器用於算法庫的目的。

+0

編輯的問題。至於爲什麼我使用直接指針,這是一個很長的故事,但它對我的使用很有意義。 –

+0

那麼,這是有效的。謝謝!仍然好奇,爲什麼它不會使用數組迭代器,但你解決了我的問題 –

+0

@ std''OrgnlDave:沒有數組迭代器 - 「std :: array :: begin()'和'std :: array :: end()'都返回'T *'。 – ildjarn

2

即使編譯器允許它,你的代碼也不會做你想要的。您試圖對從begin()/end()返回的值使用後遞增/遞減,所以您仍然將原始值分配到se,然後(如果可能)遞增/遞減他們返回的臨時對象。您顯然希望更改分配的值。

auto s= parray->begin(); 
auto e= parray->end(); 

++s; 
--e; 

std::random_shuffle(s, e); 

或者,因爲你顯然有隨機訪問迭代器反正:

std::random_shuffle(parray->begin()+1, parray->end()-1); 

我不知道爲什麼你動態分配std::array - 這似乎是非常的失敗使用點std::array開始。

+0

編輯的問題按照你說的去做,不起作用。請參閱編輯。然而,std :: array在數組頂部放置new'd是此問題簡化的一部分,它不是代碼的實際順序 –

+0

@ std''OrgnlDave:您在編輯中引用的問題聽起來很像一個編譯器問題 - 「auto」的重點在於它應該生成正確的類型以匹配所分配的值。如果是這樣,可能最容易將其更改爲'int * s = ...; int * e = ...;' –