是否可以使用std:fill
來填充unique_ptr
s的數組?其目的是對使用相同參數初始化的不同對象有不同的指針。如何填充unique_ptr的數組?
例如:
std::unique_ptr<int> ar[3];
std::fill(ar.begin(), ar.end(), make_unique_for_each_element_somehow<int>(1));
是否可以使用std:fill
來填充unique_ptr
s的數組?其目的是對使用相同參數初始化的不同對象有不同的指針。如何填充unique_ptr的數組?
例如:
std::unique_ptr<int> ar[3];
std::fill(ar.begin(), ar.end(), make_unique_for_each_element_somehow<int>(1));
沒有,但是這是std::generate
是。
代替給定在整個目標範圍內複製的單個值,std::generate
被賦予一個「發生器」函數,根據需要創建每個值。
所以,很可能是這樣的:
std::unique_ptr<int> ar[3];
std::generate(
std::begin(ar),
std::end(ar),
[]() { return std::make_unique<int>(1); }
);
我還沒有嘗試過,不知道你是否需要它擺弄不惜一切爲了避免從非複製性引起的問題。希望移動語義就足夠了。
(當然,在C++ 11,你將需要your own make_unique
function)
順便說一句,你.begin()
和.end()
是錯誤的(數組沒有成員函數),所以(感謝提醒來自songyuanyao)我糾正了這些。
@songyuanyao:是:) –
'std :: make_unique'不存在在C++ 11中:) – Quentin
@Quentin:OP已經標記了問題C++ 14。她或他或它可以總是回到自制的'make_unique'如果需要的話:) –
我不認爲你可以做std::fill()
,但它是微不足道做std::generate()
:
std::unique_ptr<int> array[10];
std::generate(std::begin(array), std::end(array),
[]{ return std::unique_ptr<int>(new int(17)); });
另一種解決方案:
std::unique_ptr<int> ar[3];
size_t i;
for (i = 0; i < elementsof(ar); ++i) {
ar[i].reset(new int);
}
是'的std ::有array'一起'std :: initializer_list'選項? –
'std :: array'是一個選項,但意圖是不重複相同的填充元素'N' times – Danra
這就是爲什麼我提出'std :: initializer_list'(或者簡單的'{}'初始化)。 –