2016-01-08 18 views
2

一個刪除一個有喜歡的對象:有效的方式來獲得的std ::地圖元素與容器

std::map<std::string, MyClass> data; 

MyClass的地方就是複製昂貴。 在某些應用程序運行流時刻,我需要執行一個操作,通過鍵(通常運算符[])檢索MyClass對象,但我需要從容器中撕下此對象。 直接解決方案是複製到局部變量,然後在容器中擦除。但是複製對於MyClass來說是一項沉重的操作。 有沒有辦法(可能以C++ 11術語)避免複製/刪除?可能有些移動語義從容器到局部變量?不知道如何做到這一點。

+0

最簡單的做法是將有效的移動語義添加到'MyClass'。 –

+0

你能告訴我這項技術嗎?我不是指MyClass的可移動ctor,但是在我的情況下使用這個,如果已經實現了可移動的MyClass – amigo421

+3

如果'MyClass'已經可以移動,並且對於有問題的元素有一個迭代器'it',那麼你可以將映射值移出局部變量,然後銷燬該元素:MyClass x = std :: move(it-> second); m.erase(it);' –

回答

1

有兩種很好的方法來處理這個問題,我可以立即想到。可能最簡單的方法是將數據定義爲

std::map<std::string, MyClass*> data; 

這意味着它現在擁有指針。您必須自己實例化MyClass的元素,將其存儲在您的地圖中,然後從地圖中刪除,而不會影響底層對象本身。智能指針可以簡化對象管理,如果這是您的偏好。

另一種方式是實現MyClass的移動語義並確保MyClass的移動操作符更加優化。如果對所有類的成員執行移動操作的代價仍然很高,那麼創建一個非常快速的移動操作符的一個相當有效的方法是讓MyClass維護一個指向一個結構的指針,該結構保存它的所有數據,並在類構造期間初始化指針並在析構函數中刪除它。此時的移動操作員實際上只是將指針從源移動到目標的問題。這不幸的是,爲MyClass中的所有其他操作添加了一個間接級別。

相關問題