C++ 映射数组运算符重载启用设置值

c++ map array operator overloading enable setting value to

本文关键字:启用 设置 重载 运算符 映射 数组 C++      更新时间:2023-10-16

我尝试做有序映射(简单非常简单)我想重载地图"[] = 值"运算符。这是数组运算符后面的等号但是如何呢?我有这个:

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) 
{
     ......
}

我已经设置了数组并正常工作,但是如何添加选项以通过数组运算符为键添加值所以这将是有效的

m_Map[CONST1] = "value"

基本上 operator[] 是一个函数调用,它只向你的类提供括号内的参数。

因此,在C++中,您实际上使用运算符[]与Delphi或C#略有不同:运算符 [] 通常返回对集合中项的引用:

myContainer[3] = value;

实际上将解析为以下内容:

MyItem refToObj& = myContainer[3];
refToObj = value;

运算符 [] 应具有以下形式

MyItem& MyContainer::operator[](int);

如果由于某种原因无法使用引用(例如,容器中实际上没有 MyItem 实例,并且 operator[] 应该将对象转换为不同的类型),那么唯一的方法是使用"帮助程序对象":

MyContainer::Helper helper = myContainer[3];
helper = value;

运算符 [] 应具有以下形式

MyContainer::Helper MyContainer::operator[](int);

其中MyHelper是一个特殊的类,它重载运算符 = 然后执行特定于容器的转换(如果您对此方法感兴趣,请参阅vector<bool>)。

编辑:回到问题:我有点不确定你到底想完成什么,但我认为你需要使用"助手"方法:

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;
    };
};

您的operator[]需要返回对索引元素的非常量引用:

V& OrderedMap<K, V>::operator[] (K _k)

函数体中,您需要检查该键是否已在映射中表示,如果是,则返回对相应值的引用。如果该键不在映射中,则默认构造一个V,将其添加到映射中,然后返回对映射中值的引用。