unordered_map中operator []的C ++特化

时间:2014-01-11 16:44:38

标签: c++ operator-overloading template-specialization unordered-map

我一直在使用unordered_map<int, myObject>指向无序地图中对象的myObject*指针。这已经工作了一段时间,但我最近发现我错误地认为添加到无序地图的myObject的内存位置将始终保持不变。

我可以在添加和删除无序地图中的元素时使用unordered_map<int, myObject*>new以及delete来解决问题。

由于我有相当多的代码,我不想在我修改无序映射的代码中的每个地方添加newdelete,我宁愿尝试重载{{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,或者做你还有其他更合适的想法吗?

编辑:添加了删除建议。这有道理吗?

1 个答案:

答案 0 :(得分:0)

要从std::unordered_map继承,只需使用

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

如果你可以使用std allocator和hash函数。但请注意,标准容器中没有虚拟析构函数。

无论如何,你最想做的事情听起来像你想拥有一个intrusive容器。如果是,则存在this相关的SO问题。