C ++映射的运算符重载
时间:2020-03-06 14:48:28 来源:igfitidea点击:
我需要帮助来了解一些C ++运算符重载语句。该类的声明如下:
template <class key_t, class ipdc_t>
class ipdc_map_template_t : public ipdc_lockable_t
{
...
typedef map<key_t,
ipdc_t*,
less<key_t>> map_t;
...
该类的创建者为内部地图结构创建了一个迭代器:
struct iterator : public map_t::iterator
{
iterator() {}
iterator(const map_t::iterator & it)
: map_t::iterator(it) {}
iterator(const iterator & it)
: map_t::iterator(
*static_cast<const map_t::iterator *>(&it)) {}
operator key_t() {return ((this->operator*()).first);} // I don't understand this.
operator ipdc_t*() const {return ((this->operator*()).second);} // or this.
};
begin()和end()返回地图的begin()和end():
iterator begin() {IT_ASSERT(is_owner()); return map.begin();}
iterator end() {return map.end();}
我的问题是,如果我有一个迭代器,如何使用这些重载来获取键和值?
ipdc_map_template_t::iterator iter;
for( iter = my_instance.begin();
iter != my_instance.end();
++iter )
{
key_t my_key = ??????;
ipdc_t *my_value = ??????;
}
解决方案
该类的创建者已覆盖了强制转换运算符。
因此,只需将iter分配给正确类型的对象,它就应该通过方法将自身自动转换为正确的值。
N.B .:值类型被存储为指针。因此,当我们提取值时,需要指定指向在地图界面中指定的值类型的指针。
typedef ipdc_map_template_t<int,std::string> MyMap;
MyMap mymap;
for(MyMap::iterator iter = mymap.begin();
iter != mymap.end();
++iter )
{
int my_key = iter;
std::string* my_value = iter;
}
不确定我是否同意此处的指示。
这会使代码更具可读性吗?我会坚持使用老式的地图迭代器听起来更有用。是否在我们需要的某些专用库中定义了此容器,或者查看boost指针容器会有所帮助吗?
运算符key_t()和运算符ipdc_t *()都是强制转换定义。因此,给定类中定义的迭代器,我们应该能够简单地分配变量:
ipdc_map_template_t::iterator iter;
for( iter = my_instance.begin();
iter != my_instance.end();
++iter )
{
key_t my_key = iter;
ipdc_t my_value = iter;
}
这些是类型转换运算符,因此我们可以执行以下操作:
{
key_t key = iter;
ipdc_t *val = iter;
}
或者,由于ipdc_map_template :: iterator是std :: map :: iterator的子类,因此我们仍然可以使用原始访问器(我认为它更易读):
{
key_t key = (*iter).first;
ipdc_t *val = (*iter).second;
// or, equivalently
key_t key = iter->first;
ipdc_t *val = iter->second;
}

