2013-04-13 65 views
1

我有這樣一個動態分配的陣列上的唯一指針:(?我認爲,在模板參數[]是很重要的,右)在unique_ptr的動態分配數組上應用std :: begin()?

const int quantity = 6; 
unique_ptr<int[]> numbers(new int[quantity]); 

這應該是正確爲止。 順便說一下:是否有可能在這裏初始化像int some_array[quantity] = {};這樣的元素?

現在我試圖遍歷數組是這樣的:

for (auto it = begin(numbers); it != end(numbers); ++it) 
    cout << *it << endl; 

但我想不通,語法如何是正確的。有沒有辦法? 或者我可以用這樣的指標:

for (int i = 0; i < quantity; ++i) 
    cout << numbers[i] << endl; 

是首選的其中之一? (不直接與標題相關:作爲下一步,我希望將它減少到基於範圍的for循環,但我現在只是擁有VS2010,但不能嘗試這樣做,但會有什麼我必須採取照顧?)

謝謝! Gerrit

+0

你不能遍歷'unique_ptr',它就是一個指針。指針不是範圍。他們沒有開始或結束。你只需要在某處使用'quantity'。另外,是的,你可以像這樣初始化它:'new int [quantity]()'。 – GManNickG

+2

爲什麼你不只是使用矢量有什麼特別的理由嗎? – Cubic

+0

@GManNickG我只是認爲有一種方法,因爲你可以使用數組的開始()。感謝那個初始化技巧。這是C++ 11還是總是可能的? – Gerrit

回答

2

編譯器應該應用此原型std::begin

template< class T, size_t N > 
T* begin(T (&array)[N]); 

這意味着參數類型是int(&)[N],既不std::unique_ptr也不int *。如果這是可能的,std::end怎麼能計算出最後一個呢?

但爲什麼不直接使用原始指針或STL容器?

const int quantity = 6; 
std::unique_ptr<int[]> numbers{new int[quantity]}; 
// assignment 
std::copy(numbers.get(), numbers.get() + quantity, 
      std::ostream_iterator<int>(std::cout, "\n")); 
+0

現在我明白了。謝謝。計數器部分同樣被定義爲'template T * end(T(&array)[N]);'並且由於'N'都知道尺寸。編譯器本身是否推導出「N」?我不需要明確寫出它:[link](http://ideone.com/0XlTB4)。我會嘗試另外兩個建議。 'vector'在這裏被多次提及:是否有固定大小的變體? 'array'不起作用,因爲我只知道運行時的大小(不是編譯時間)。 – Gerrit

+0

對於'int(&)[N]',它可以獲得大小,但不能用於'std :: unique_ptr ',也不能'int *'。我只是說這些類型並不完全相同。所以編譯器不能推導出N,除非你提供一個明確的類型轉換。而'std :: vector'對於固定大小的數組來說很好。如果你不習慣使用'push_back()'追加元素,只需先調用'vector :: resize()',然後你可以通過'array [n]'來訪問它們。順便說一下,'vector :: data()'可以得到它的原始指針,它的類型是'T *',並且必須與你的遺留代碼兼容。 –

+0

'>> std :: unique_ptr numbers {new int [quantity]};'不應該是'std :: unique_ptr numbers {new int [quantitiy]};'?以前不會嘗試使用'delete'而不是'delete []' – balki

3

在C++中動態分配數組(即:new []的結果)沒有大小信息。因此,您無法獲取數組的大小。

您可以實現std::begin這樣的:

namespace std 
{ 
    template<typename T> T* begin(const std::unique_ptr<T[]> ptr) {return ptr.get();} 
} 

但有沒有辦法實現end

您是否考慮過使用std::vector?有了移動支持,它不應該比數組unique_ptr貴。