C++ C++;模板类映射

C++ C++;模板类映射,c++,templates,map,iterator,C++,Templates,Map,Iterator,我将构造函数和两个函数添加到上一个链接问题的类中,在这一点上我需要帮助: 你认为这个构造器是做什么的 在地图的开头添加一个值 在main中初始化后,我在相应的键中只看到一个地址作为值。怎么了 运算符[]应该获取特定键的值。但是,我不能使用它来获取输出中的映射元素。有什么提示吗 template<class K, class V> class template_map{ public: template_map( V const& val) { m_

我将构造函数和两个函数添加到上一个链接问题的类中,在这一点上我需要帮助:

  • 你认为这个构造器是做什么的
  • 在地图的开头添加一个值
  • 在main中初始化后,我在相应的键中只看到一个地址作为值。怎么了
运算符[]应该获取特定键的值。但是,我不能使用它来获取输出中的映射元素。有什么提示吗

template<class K, class V>
class template_map{
public:
    template_map( V const& val) {
        m_map.insert(my_map.begin(),std::make_pair(std::numeric_limits<K>::min(),val));
    };    

    typedef typename std::map<K,V> TMap;

    TMap my_map;
    typedef typename TMap::const_iterator const_iterator;
    const_iterator begin() const { return my_map.begin(); }
    const_iterator end() const   { return my_map.end(); }
    V const& operator[]( K const& key ) const {
        return ( --my_map.upper_bound(key) )->second;
    }

    ...
};

int main()
{
    interval_map<int,int> Map1 (10);
    //Show the elements of the map?
}
模板
类模板映射{
公众:
模板映射(V常量和val){
m_map.insert(my_map.begin(),std::make_pair(std::numeric_limits::min(),val));
};    
typedef typename std::map TMap;
TMap my_map;
typedef typename TMap::const_迭代器const_迭代器;
常量迭代器begin()常量{返回我的映射。begin();}
const_迭代器end()const{return my_map.end();}
V常量和运算符[](K常量和键)常量{
return(-my_map.upper_bound(key))->second;
}
...
};
int main()
{
区间图Map1(10);
//显示地图的元素?
}
还要考虑它应该是一个向映射中插入值的函数

你认为这个构造器是做什么的?同时添加一个值 地图的开始?我看在各自的钥匙里只有一个地址 作为在main中初始化后的值。怎么了

它将此值添加到地图中。迭代器参数只是一个提示:如果要在该位置之后插入新项,则可以更快地完成操作。否则,映射将需要像往常一样找到正确的位置来插入新值

运算符[]应该获取特定键的值。 但是,我不能使用它来获取地图中的元素 输出。有什么提示吗

上限
将迭代器返回到第一个键值对,其中键大于参数
--上限
因此会向项返回迭代器,该项的键等于或小于查询的键。如果
上限
返回
map.begin()
,因为所有键都大于查询,所以递减它是未定义的行为

这里需要的是
find
成员函数。您还需要处理找不到密钥的情况(
map.end()
返回),例如抛出异常

或者,您可以根据
map::operator[]
实现
操作符[]
。这意味着函数不能是常量,因为如果找不到键,map会插入一个新的默认值

你认为这个构造器是做什么的?同时添加一个值 地图的开始?我看在各自的钥匙里只有一个地址 作为在main中初始化后的值。怎么了

它将此值添加到地图中。迭代器参数只是一个提示:如果要在该位置之后插入新项,则可以更快地完成操作。否则,映射将需要像往常一样找到正确的位置来插入新值

运算符[]应该获取特定键的值。 但是,我不能使用它来获取地图中的元素 输出。有什么提示吗

上限
将迭代器返回到第一个键值对,其中键大于参数
--上限
因此会向项返回迭代器,该项的键等于或小于查询的键。如果
上限
返回
map.begin()
,因为所有键都大于查询,所以递减它是未定义的行为

这里需要的是
find
成员函数。您还需要处理找不到密钥的情况(
map.end()
返回),例如抛出异常


或者,您可以根据
map::operator[]
实现
操作符[]
。这意味着函数不能是常量,因为如果找不到键,map将插入一个新的默认值。

map::insert()中的迭代器只是一个提示;从本质上讲,它对程序的语义没有任何意义

代码插入通过构造函数参数传递的值以及键
numeric\u limits::min()
,即给定键类型的最小可能值。仅当
数值\u限制
专门用于
K
类型时,此选项才会生效


还要注意,如果键已经存在,则相应的映射值不会被覆盖,因此相应的插入函数的使用将非常有限。

map::insert()中的迭代器只是一个提示;从本质上讲,它对程序的语义没有任何意义

代码插入通过构造函数参数传递的值以及键
numeric\u limits::min()
,即给定键类型的最小可能值。仅当
数值\u限制
专门用于
K
类型时,此选项才会生效

还要注意,如果键已经存在,则相应的映射值不会被覆盖,因此相应的插入函数的使用将非常有限

你认为这个构造器是做什么的?在地图的开头添加一个值

它初始化映射,使任何
x
map[x]==v
。映射将间隔与值关联,在内部存储由每个间隔的开始键入的正常映射;它被初始化,以便键类型的整个范围映射到初始值

在main中初始化后,我在相应的键中只看到一个地址作为值。怎么了?运算符[]应该获取特定键的值。但是,我不能使用它来获取输出中的映射元素。有什么提示吗

我不知道你在问什么。
Map1.my_map.insert(std::make_pair(interval_start, value));
V & operator[](K const & key) {
    V const & old_value = (--my_map.upper_bound(key))->second;
    return *my_map.insert(std::make_pair(key, old_value)).first;
}
for (auto it = Map1.begin(); it != Map1.end(); ++it) {
    std::cout << it->first << " maps to " << it->second << '\n';
}