C++ 映射数组运算符重载启用设置值
c++ map array operator overloading enable setting value to
我尝试做有序映射(简单非常简单)我想重载地图"[] = 值"运算符。这是数组运算符后面的等号但是如何呢?我有这个:
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
,将其添加到映射中,然后返回对映射中值的引用。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 编译时未启用intel oneApi CUDA支持
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何使用cmake设置OpenCV以启用动态和静态构建
- 如何设置启用setFixize后再次调整主窗口大小
- 使用CMAKE设置启用增量链接到VS2012中的NO
- 启用接口/设置来自C++(使用Qt)和Linux的IP
- 如何在Visual c++中使用#pragma同时启用两个区域设置
- C++ 映射数组运算符重载启用设置值