亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

數組的unique_ptr有什么用嗎?

數組的unique_ptr有什么用嗎?

C++
ibeautiful 2019-10-05 15:29:15
std::unique_ptr 支持數組,例如:std::unique_ptr<int[]> p(new int[10]);但是需要嗎?也許使用std::vector或更方便std::array。您發現該構造有什么用嗎?
查看完整描述

3 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

有些人甚至沒有使用std::vector分配器,也不享受使用的奢侈。有些人需要一個動態大小的數組,所以std::array就不用了。有些人從其他已知返回數組的代碼中獲取數組。而且該代碼不會被重寫以返回a vector或其他內容。


通過允許unique_ptr<T[]>,您可以滿足這些需求。


簡而言之,您unique_ptr<T[]>在需要時使用。當替代品根本無法為您服務時。這是不得已的工具。


查看完整回答
反對 回復 2019-10-05
?
慕村9548890

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[]> 不是容器

我確實必須承認,這似乎是基于策略設計進行某些重構的機會。


查看完整回答
反對 回復 2019-10-05
?
白板的微信

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。


查看完整回答
反對 回復 2019-10-05
  • 3 回答
  • 0 關注
  • 1665 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號