我一直在使用unordered_map<int, myObject>
和myObject*
指向無序映射中對象的指針。這已經有一段時間了,但我最近發現我錯誤地認爲添加到無序映射的myObject的內存位置總是保持不變。unordered_map中operator []的C++特化
我可以通過使用unordered_map<int, myObject*>
和new
和delete
來解決問題,當添加和從無序映射中刪除元素。
因爲我有很長一段代碼,我不想增加new
和delete
在我修改無序地圖代碼的每一個地方,我寧願嘗試過量unordered_map::operator[]
和unordered_map::erase()
使得new
和delete
使用會透明地發生,我不必改變我現有的代碼。 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
中刪除,或者您是否有其他想法可能更適合?
編輯:增加了擦除建議。這有道理嗎?
如何使用myObject的值語義封裝?類似於'unique_ptr',但在默認ctor中自動創建'myObject'。或者你可以使用'std :: map',它的'insert'函數不會使引用無效。 –
dyp
感謝您的評論,我不知道'std :: map'沒有使參考無效。我已經更新了我的問題,我將首先嚐試以建議的方式解決問題。 – Ronny
您正在更改存儲在地圖中的指針的*副本。你必須使用類似'mapped_type *&ptr = internal_map [_Keyval];' – dyp