我编写的代码允许按照输入的顺序遍历映射数据。
我编码了几次的解决方案是:
给定一个keytype,K和和数据类型D, 的std ::地图 的std ::矢量
当想要随机查找数据条目时,请使用map.find(K)
。当人们想要按照分录顺序遍历地图时,请使用std::vector::iterator (begin(), end()]
。
这很好,但作为练习,我想将此'OrderedMap'
写为符合STL的容器。我也有(摘要讨论):
template <typename K, typename D>
class OrderedMapValue
{
private:
K first_ref;
std::map<K,size_t>& m;
std::vector<D>& v;
public:
const K& first
D& second
assignment operator=(const D& data)
{
std::map<K,size_t>::const_iterator iter = m.find(first_ref);
v[iter.second] = data; // error checking of iter stripped
}
};
进一步假设
template <typename K, typename D>
class OrderedMap
{
public:
typename OrderedMapValue<K,D>& OrderedMap<K,D>::operator[](const K&);
// snip...
};
class MyClass
{
public:
MyClass(std::string s) : _my_data(s) {}
private:
std::string _my_data;
};
以下代码有效:
OrderedMap<std::string,MyClass*> omap;
omap["MyKey"] = new MyClass("dummy");
但是,此代码不会:
OrderedMap::iterator iter = omap.find("MyKey");
MyClass * obj = iter->second;
delete obj;
iter->second = new MyClass("dummy");
假设我做了一些事情 a)结构愚蠢或 b)不必要的复杂,应该怎么做?
我意识到我可能会在这里重新发明轮子,但同样,这项努力主要是为了增加我对STL容器,设计模式和正确使用的了解。
提前感谢任何见解,
答案 0 :(得分:2)
我现在没有编译器来测试这个,所以可能会有错误,但我认为你想要它更像:
template <typename K, typename D>
class OrderedMap
{
private:
std::map<K,size_t> &m;
std::vector<D> &v;
public:
typename pair<K,D> TYPE;
TYPE& operator[](const K &k)
{
return v[ m[ k ]];
}
TYPE& operator[](size_t idx)
{
return v[ idx ];
}
pair<iterator,bool> insert( const TYPE& pair )
{
map<K, size_t>::const_iterator iter;
iter = m.find( pair.first );
if( iter != m.end() )
return make_pair( v[ iter.second], false );
m.insert( make_pair( pair->first, v.size() ));
v.push_back( pair->second );
return make_pair( v.last() , inserted );
}
iterator &begin()
{
return v.begin();
}
// etc
};
答案 1 :(得分:0)
在OrderedMapValue::operator=
中,您有:
std::map<K,size_t>::const_iterator iter = m.find(first_ref);
什么是first_ref
?代码在其他地方没有引用它(没有双关语)。在我看来,它可能是旧实施的遗迹,由公共成员在其他地方取代
const K& first
。
这可能是问题吗?
评论中的 编辑:代码没有显示first_ref在任何地方被初始化;所以我可以说,对m.find(first_ref)
的调用是搜索空字符串,而不是OrderedMapValue的键。