2

我一直在使用unordered_map<int, myObject>myObject*指向無序映射中對象的指針。這已經有一段時間了,但我最近發現我錯誤地認爲添加到無序映射的myObject的內存位置總是保持不變。unordered_map中operator []的C++特化

我可以通過使用unordered_map<int, myObject*>newdelete來解決問題,當添加和從無序映射中刪除元素。

因爲我有很長一段代碼,我不想增加newdelete在我修改無序地圖代碼的每一個地方,我寧願嘗試過量unordered_map::operator[]unordered_map::erase()使得newdelete使用會透明地發生,我不必改變我現有的代碼。 unordered_map::operator[]然後可以返回對myObject本身的引用,而不是指針。

我曾試圖繼承unordered_map,但我不知道我應該如何添加模板參數列表:

using namespace std; 

template<class _Kty, 
class _Ty, 
class _Hasher = hash<_Kty>, 
class _Keyeq = equal_to<_Kty>, 
class _Alloc = allocator<pair<const _Kty, _Ty> > > 
class my_unordered_map : public unordered_map<_Umap_traits<_Kty, _Ty, 
_Uhash_compare<_Kty, _Hasher, _Keyeq>, _Alloc, false> > 
{ 

}; 

但我得到的錯誤,如:

error C2976: 'std::unordered_map' : too few template arguments 
error C2955: 'std::unordered_map' : use of class template requires template argument list 

然後,我意識到它可能可以在myObject*類型中使用unordered_map添加專門化爲std,但是我不確定是否甚至有可能使operator[]專業化。

我提供任何幫助,我可以得到,謝謝!

編輯:

我現在已經創建了一個template <class mapped_type>類的unordered_map<int, mapped_type*>作爲內部結構。該operator[]相當簡單,包括:

template <class mapped_type> class MyMap { 
public: 
    std::unordered_map<int, mapped_type*> internal_map; 

    mapped_type& operator[](int&& _Keyval) 
    { // find element matching _Keyval or insert with default mapped 
     mapped_type*& ptr = internal_map[_Keyval]; 
     if (ptr == nullptr) ptr = new mapped_type(); 
     return *ptr; 
    } 
} 

void erase(const int& _Keyval) 
{ // erase and count all that match _Keyval 
    mapped_type* ptr = internal_map[_Keyval]; 
    if (ptr) delete ptr; 
    internal_map.erase(_Keyval); 
} 

void clear() 
{ // erase all 
    internal_map.clear(); 
} 

現在的問題是擦除方法(包括在std::_Hash默認方式)。我並不需要迭代器,所以我猜最好的方法可能是先使用operator[]方法找到條目,然後使用delete,然後再將其從internal_map中刪除,或者您是否有其他想法可能更適合?

編輯:增加了擦除建議。這有道理嗎?

+4

如何使用myObject的值語義封裝?類似於'unique_ptr ',但在默認ctor中自動創建'myObject'。或者你可以使用'std :: map',它的'insert'函數不會使引用無效。 – dyp

+0

感謝您的評論,我不知道'std :: map'沒有使參考無效。我已經更新了我的問題,我將首先嚐試以建議的方式解決問題。 – Ronny

+1

您正在更改存儲在地圖中的指針的*副本。你必須使用類似'mapped_type *&ptr = internal_map [_Keyval];' – dyp

回答

0

std::unordered_map繼承它是足夠使用

template <class T,class V> 
class MyMap : public unordered_map<T, V> 

如果其確定爲您使用std分配器和哈希函數。但要小心,標準容器中沒有虛擬析構函數。

無論如何,你想要做的到底對我來說聽起來像是你想擁有一個intrusive容器。如果是這樣,那麼有this相關的SO問題。

+0

從標準容器繼承不是一個好主意 –

+0

@ n.m。添加了免責聲明。 –

+0

感謝您的建議,我現在已經更新了我的問題,似乎我可以通過這種方式解決問題。 – Ronny