c ++ map array operator重载启用设置值为

时间:2015-06-11 07:17:53

标签: c++ operator-overloading stdmap

我尝试做有序地图(简单非常简单) 我想重载地图“[] =值”运算符。这是数组运算符之后的等号 但怎么样? 我有这个:

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"

2 个答案:

答案 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,将其添加到地图,然后返回对地图中值的引用。