I have been using unordered_map<int, myObject>
with myObject*
pointers to the objects in the unordered map. This has worked for a while, but I recently dicovered that I wrongly assumed that the memory location of myObject added to the unordered map would always remain the same.
I can solve the problem by using unordered_map<int, myObject*>
and new
and delete
when adding and removing elements from the unordered map.
Since I have quite some code I would not want to add new
and delete
every place in the code where I am modifying the unordered map, I would rather try to overload the unordered_map::operator[]
and unordered_map::erase()
such that the usage of new
and delete
would happen transparently and I would not have to change my existing code. unordered_map::operator[]
could then return a reference to the myObject itself rather than the pointer.
I have tried to inherit unordered_map
but I am not sure how I should add the template argument list:
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> >
{
};
But I am getting errors such as:
error C2976: 'std::unordered_map' : too few template arguments
error C2955: 'std::unordered_map' : use of class template requires template argument list
Then I realized it might be possible to add a specialization to std when using the myObject*
type with unordered_map
, but I am not sure if it is even possible to overload the operator[]
with a specialization.
I apprechiate any help I could get, thank you!
Edit:
I have now created a template <class mapped_type>
class with an unordered_map<int, mapped_type*>
as an internal structure. The operator[]
was fairly straightforward to include:
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();
}
Now the problem is the erase methods (default methods are included in std::_Hash
). I do not really need an iterator so I guess the best way might be to use the operator[]
method first to find the entry and then use delete
before removing it from the internal_map
, or do you have any other ideas that might be more suitable?
Edit: Added suggestion for erase. This makes sense right?