3 回答
TA貢獻2080條經驗 獲得超4個贊
有些人甚至沒有使用std::vector分配器,也不享受使用的奢侈。有些人需要一個動態大小的數組,所以std::array就不用了。有些人從其他已知返回數組的代碼中獲取數組。而且該代碼不會被重寫以返回a vector或其他內容。
通過允許unique_ptr<T[]>,您可以滿足這些需求。
簡而言之,您unique_ptr<T[]>在需要時使用。當替代品根本無法為您服務時。這是不得已的工具。
TA貢獻1884條經驗 獲得超4個贊
需要權衡,然后選擇與您想要的解決方案匹配的解決方案。從我的頭頂上:
初始尺寸
vector并unique_ptr<T[]>允許在運行時指定大小
array 僅允許在編譯時指定大小
調整大小
array并且unique_ptr<T[]>不允許調整大小
vector 確實
存儲
vector并將unique_ptr<T[]>數據存儲在對象外部(通常在堆上)
array 將數據直接存儲在對象中
復制中
array并vector允許復制
unique_ptr<T[]> 不允許復制
交換/移動
vector并unique_ptr<T[]>具有O(1)時間swap和移動操作
array具有O(n)次時間swap和移動操作,其中n是數組中元素的數量
指針/引用/迭代器無效
array 確保即使對象處于活動狀態,指針,引用和迭代器也不會失效 swap()
unique_ptr<T[]>沒有迭代器;指針和引用僅swap()在對象處于活動狀態時才失效。(交換之后,指針指向交換對象所在的數組,因此在這種意義上它們仍然是“有效的”。)
vector 可能會使任何重新分配上的指針,引用和迭代器無效(并提供一些保證,即重新分配只能在某些操作上進行)。
與概念和算法的兼容性
array而且vector都是容器
unique_ptr<T[]> 不是容器
我確實必須承認,這似乎是基于策略設計進行某些重構的機會。
TA貢獻1883條經驗 獲得超3個贊
可能使用a的原因之一unique_ptr是,如果您不想支付對數組進行值初始化的運行時成本。
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構造函數和std::vector::resize()將值初始化T-但new不會做,如果T是一個POD。
請參見C ++ 11中的值初始化對象和std :: vector構造函數
請注意,這vector::reserve不是替代方案:在std :: vector :: reserve之后訪問原始指針是否安全?
這是同樣的原因,C程序員可能選擇malloc了calloc。
- 3 回答
- 0 關注
- 1665 瀏覽
添加回答
舉報
