3 回答

TA貢獻2080條經(jīng)驗 獲得超4個贊
有些人甚至沒有使用std::vector分配器,也不享受使用的奢侈。有些人需要一個動態(tài)大小的數(shù)組,所以std::array就不用了。有些人從其他已知返回數(shù)組的代碼中獲取數(shù)組。而且該代碼不會被重寫以返回a vector或其他內(nèi)容。
通過允許unique_ptr<T[]>,您可以滿足這些需求。
簡而言之,您unique_ptr<T[]>在需要時使用。當替代品根本無法為您服務(wù)時。這是不得已的工具。

TA貢獻1884條經(jīng)驗 獲得超4個贊
需要權(quán)衡,然后選擇與您想要的解決方案匹配的解決方案。從我的頭頂上:
初始尺寸
vector并unique_ptr<T[]>允許在運行時指定大小
array 僅允許在編譯時指定大小
調(diào)整大小
array并且unique_ptr<T[]>不允許調(diào)整大小
vector 確實
存儲
vector并將unique_ptr<T[]>數(shù)據(jù)存儲在對象外部(通常在堆上)
array 將數(shù)據(jù)直接存儲在對象中
復制中
array并vector允許復制
unique_ptr<T[]> 不允許復制
交換/移動
vector并unique_ptr<T[]>具有O(1)時間swap和移動操作
array具有O(n)次時間swap和移動操作,其中n是數(shù)組中元素的數(shù)量
指針/引用/迭代器無效
array 確保即使對象處于活動狀態(tài),指針,引用和迭代器也不會失效 swap()
unique_ptr<T[]>沒有迭代器;指針和引用僅swap()在對象處于活動狀態(tài)時才失效。(交換之后,指針指向交換對象所在的數(shù)組,因此在這種意義上它們?nèi)匀皇恰坝行У摹?。?/p>
vector 可能會使任何重新分配上的指針,引用和迭代器無效(并提供一些保證,即重新分配只能在某些操作上進行)。
與概念和算法的兼容性
array而且vector都是容器
unique_ptr<T[]> 不是容器
我確實必須承認,這似乎是基于策略設(shè)計進行某些重構(gòu)的機會。

TA貢獻1883條經(jīng)驗 獲得超3個贊
可能使用a的原因之一unique_ptr是,如果您不想支付對數(shù)組進行值初始化的運行時成本。
std::vector<char> vec(1000000); // allocates AND value-initializes 1000000 chars
std::unique_ptr<char[]> p(new char[1000000]); // allocates storage for 1000000 chars
該std::vector構(gòu)造函數(shù)和std::vector::resize()將值初始化T-但new不會做,如果T是一個POD。
請參見C ++ 11中的值初始化對象和std :: vector構(gòu)造函數(shù)
請注意,這vector::reserve不是替代方案:在std :: vector :: reserve之后訪問原始指針是否安全?
這是同樣的原因,C程序員可能選擇malloc了calloc。
- 3 回答
- 0 關(guān)注
- 1618 瀏覽
添加回答
舉報