我尝试做有序地图(简单非常简单) 我想重载地图“[] =值”运算符。这是数组运算符之后的等号 但怎么样? 我有这个:
template <typename K, class V>
class OrderedMap
{
public:
OrderedMap(){};
~OrderedMap(){};
void setValue(K _k);
void operator[] (K _k);
private:
std::vector<K> insertOrder;
std::tr1::unordered_map<K, V> myTable;
};
template <typename K, class V>
OrderedMap<K, V>::setValue(K _k)
{
myTable[_k];
insertOrder.push_back(_k);
}
template <typename K, class V>
void OrderedMap<K, V>::operator[] (K _k)
{
......
}
我有数组和工作,但如何添加选项,以通过数组运算符向键添加值 所以这将是vaild
m_Map[CONST1] = "value"
答案 0 :(得分:2)
基本上,operator []是一个函数调用,它只将括号内的参数提供给你的类。
所以在C ++中你实际上使用的运算符[]有点不同,比如说Delphi或C#: operator []通常返回对集合中项目的引用:
myContainer[3] = value;
实际上将解析为以下内容:
MyItem refToObj& = myContainer[3];
refToObj = value;
运营商[]应该具有以下形式
MyItem& MyContainer::operator[](int);
如果由于某种原因无法使用引用(例如,您实际上并没有在容器中有MyItem实例,而operator []应该将对象转换为其他类型)那么唯一的方法是使用一个&#34;帮助对象&#34;:
MyContainer::Helper helper = myContainer[3];
helper = value;
运营商[]应该具有以下形式
MyContainer::Helper MyContainer::operator[](int);
其中MyHelper
是一个特殊的类,它会重载operator =然后执行容器特定的转换(如果您对此方法感兴趣,请参阅vector<bool>
。)
编辑: 回到这个问题:我有点不确定你想要完成什么,但我认为你需要使用&#34; Helper&#34;的方法:
class OrderedMap
{
class ItemHelper
{
public:
ItemHelper(OrderedMap& map, K key): m_map(map), m_key(key) {}
//writing a value
V& operator=(const V& v)
{
m_map.setValue(m_key);
m_map.myTable[m_key] = v;
}
//reading a value
operator const V&() { return m_map[k]; }
private:
K m_key;
OrderedMap& m_map;
};
};
答案 1 :(得分:0)
您的operator[]
需要返回对索引元素的非const引用:
V& OrderedMap<K, V>::operator[] (K _k)
在函数体中,您需要检查该键是否已在地图中表示,如果是,则返回对相应值的引用。如果该键不在地图中,则默认构造V
,将其添加到地图,然后返回对地图中值的引用。