c ++映射数组运算符重载启用设置值
c++ map array operator overloading enable setting value to
我尝试做有序地图(简单非常简单)
我想重载地图“[] = value”运算符。那是数组运算符后面的等号
但如何?
我有这个:
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[]
需要 return 对索引元素的非常量引用:
V& OrderedMap<K, V>::operator[] (K _k)
在您的函数体中,您需要检查该键是否已在映射中表示,如果是,return 对相应值的引用。如果该键不在地图中,默认构造一个 V
,将其添加到地图,然后 return 对地图中值的引用。
基本上 operator[] 是一个函数调用,它只向您的 class.
提供括号内的参数
所以在 C++ 中,您实际上使用运算符 [] 与我们说的 Delphi 或 C# 有点不同:
operator[] 通常 returns 对集合内项目的引用:
myContainer[3] = value;
实际上将解析为以下内容:
MyItem refToObj& = myContainer[3];
refToObj = value;
operator[] 应具有以下形式
MyItem& MyContainer::operator[](int);
如果您由于某种原因无法使用引用(例如,您的容器中实际上没有 MyItem 实例,并且 operator[] 应该将对象转换为不同的类型),那么唯一的方法是使用一个 "helper object":
MyContainer::Helper helper = myContainer[3];
helper = value;
operator[] 应具有以下形式
MyContainer::Helper MyContainer::operator[](int);
其中 MyHelper
是一个特殊的 class,它重载了 operator=,然后进行容器特定的转换(如果您对这种方法感兴趣,请参阅 vector<bool>
)。
编辑:
回到问题上来:我有点不确定你到底想完成什么,但我认为你需要使用 "Helper" 方法:
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;
};
};
我尝试做有序地图(简单非常简单) 我想重载地图“[] = value”运算符。那是数组运算符后面的等号 但如何? 我有这个:
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[]
需要 return 对索引元素的非常量引用:
V& OrderedMap<K, V>::operator[] (K _k)
在您的函数体中,您需要检查该键是否已在映射中表示,如果是,return 对相应值的引用。如果该键不在地图中,默认构造一个 V
,将其添加到地图,然后 return 对地图中值的引用。
基本上 operator[] 是一个函数调用,它只向您的 class.
提供括号内的参数所以在 C++ 中,您实际上使用运算符 [] 与我们说的 Delphi 或 C# 有点不同: operator[] 通常 returns 对集合内项目的引用:
myContainer[3] = value;
实际上将解析为以下内容:
MyItem refToObj& = myContainer[3];
refToObj = value;
operator[] 应具有以下形式
MyItem& MyContainer::operator[](int);
如果您由于某种原因无法使用引用(例如,您的容器中实际上没有 MyItem 实例,并且 operator[] 应该将对象转换为不同的类型),那么唯一的方法是使用一个 "helper object":
MyContainer::Helper helper = myContainer[3];
helper = value;
operator[] 应具有以下形式
MyContainer::Helper MyContainer::operator[](int);
其中 MyHelper
是一个特殊的 class,它重载了 operator=,然后进行容器特定的转换(如果您对这种方法感兴趣,请参阅 vector<bool>
)。
编辑: 回到问题上来:我有点不确定你到底想完成什么,但我认为你需要使用 "Helper" 方法:
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;
};
};