我std::maps對emplace(). emplace()是具有以下宣告的可變引數模板函式:
template <class Args...>
iterator emplace( Args&&... args );
據我了解,emplace()完全避免構造它的value_type,即,std::pair<const key_type,mapped_type>而是就地構造物件。我假設這意味著物件只被構造一次,即創建新地圖節點的那一刻。物件永遠不會被復制或移動。
我不明白的是如何std::map在構造鍵值對之前找到添加新條目的正確位置。據我所知,std::map需要訪問密鑰,但密鑰包含在其中args,并且只能在構建鍵值對之后才能訪問。
我一定是誤解了emplace(). 是否std::map真的避免構建鍵值對?如果是這樣,它如何避免移動/復制操作?還是有其他方法可以訪問密鑰args?
uj5u.com熱心網友回復:
emplace就地構造對,將引數轉發給它的建構式;它并沒有避免element_type構造,它只是避免了一個無用的臨時對的副本insert。在這方面,就像其他容器一樣:emplace就像insert,但是如果接收到一個現成的element_type要在容器內復制或移動,它會接收要element_type在其目標位置構造的引數。
進一步澄清:如果您呼叫emplace(key, value) key并在構建對時無論如何value 被復制/移動。只是,如果你這樣做了insert(make_pair(key, value)),不僅key和value在創建臨時對引數時會被復制/移動,而且對本身也需要在映射節點中移動。
我不認為這是OP打算要求的。對我來說,預期的問題似乎是
std::map如果在搜索位置之前無法構造鍵,如何找到插入新元素的正確位置,例如,如果第一個引數emplace不是鍵型別本身,如何找到插入新元素的正確位置。
在這種情況下,std::map問題不大:首先你可以構造一個節點(它包含對和指向其他節點的各種指標,并且在堆上有自己的分配),然后你可以把它放在右邊放在 RB 樹中(歸結為幾個指標分配)。
uj5u.com熱心網友回復:
好吧,IIRC,std::map并std::unrodered_map使用樹狀結構,有很多小節點相互指向。因此,一旦構建了對 - 它不必移動到任何地方,地圖只需要從某個地方指向它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/459557.html
上一篇:包裝一個接受std::function<double(doule)>的函式,以便傳遞接受更多引數的函式
下一篇:沒有定義宏的代碼重復問題
