我一直在使用unordered_map<int, myObject>
指向无序地图中对象的myObject*
指针。这已经工作了一段时间,但我最近发现我错误地认为添加到无序地图的myObject的内存位置将始终保持不变。
我可以在添加和删除无序地图中的元素时使用unordered_map<int, myObject*>
和new
以及delete
来解决问题。
由于我有相当多的代码,我不想在我修改无序映射的代码中的每个地方添加new
和delete
,我宁愿尝试重载{{1} }和unordered_map::operator[]
使unordered_map::erase()
和new
的使用透明地发生,我不必更改现有代码。然后delete
可以返回对myObject本身的引用而不是指针。
我试图继承unordered_map::operator[]
,但我不确定如何添加模板参数列表:
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*
一起使用时,可能会向std添加特化,但我不确定是否有可能重载unordered_map
专业化。
我能得到任何帮助,谢谢!
编辑:
我现在已经创建了一个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
,或者做你还有其他更合适的想法吗?
编辑:添加了删除建议。这有道理吗?