在类模板中创建地图的迭代器

时间:2016-08-15 11:51:53

标签: c++ templates iterator

我有这个类模板,其中包含如下地图:

template<class K, class V>
class interval_map {

private:
    std::map<K,V> m_map;    
}

我希望有一个函数可以为映射添加值并检查密钥是否已经存在,所以我尝试使用迭代器来执行此操作:

void add_elements_test2 ( K const& key,V const& val)
{             
    std::make_pair<typename std::map<K,V>::iterator,bool>x;  
    x= m_map.insert(std::make_pair(key,val));
    if(x.second = false)
    {
        cout<<"Key alreads exists "<<endl;
    }
}

但是在创建运算符时出现此错误:

std::make_pair<typename std::map<K,V>::iterator,bool>x;

这是正确的方法吗?

3 个答案:

答案 0 :(得分:1)

只需使用auto

auto x = m_map.insert(std::make_pair(key, val));
if (!x.second)
{
    cout << "Key already exists" << endl;
}

注意:您想要的类型是pair

std::pair<typename std::map<K, V>::iterator, bool>

std::make_pair是用于创建std::pair的实用程序功能。

答案 1 :(得分:1)

std::make_pair<typename std::map<K,V>::iterator,bool>x;  

它无法更正声明std::pair的正确方法。如果您要为std::pair的返回声明insert,那么您需要

std::pair<typename std::map<K,V>::iterator,bool> x;

现在x的类型正确。 std::make_pair是一个用于构造std::pair的函数,您可以将变量传递给它来生成该对。

您可以简单地使用auto之类的

,而不必输入所有这些内容
auto x = m_map.insert(std::make_pair(key,val));
//...

现在x的类型正确,而且输入的次数要少得多。

你也有输入错字

if(x.second = false)

在上面你做的是作业,而不是比较。由于您将值设置为false,因此if语句将永远不会运行,因为它始终会计算为false。你需要

if(x.second == false)

答案 2 :(得分:-1)

我写了这个答案,以便你以后不讨厌模板类。您需要考虑两种情况,我在下面的代码中列出了它们。如果您有任何问题,请告诉我,评论详细。

场景1,add_elements_test2在类中定义

template<class K, class V>
class interval_map {
private:
    std::map<K,V> m_map;    

    // This is fine because the K and V types are in the same scope for the map, and add_elements_test2
    void add_elements_test2 ( K const& key,V const& val)
    {
        // Use auto here to simplify your life a little
        auto x = m_map.insert(std::make_pair(key,val)); // actual type is std::pair<K, bool>
        if(x.second == false)
        {
            cout<<"Key already exists "<<endl;
        }
    }
};

场景2,add_elements_test2在类外定义

template<class K, class V>
class interval_map {
private:
    std::map<K,V> m_map;    

    void add_elements_test2 ( K const& key,V const& val);
};

// need another template
template<class K, class V>
// need to template interval_map, this could cause headaches if you did not realize this is a templated class
void interval_map<K, V>::add_elements_test2 ( K const& key,V const& val)
{
    // Use auto here to simplify your life a little
    auto x = m_map.insert(std::make_pair(key,val)); // actual type is std::pair<K, bool>
    if(x.second == false)
    {
        cout<<"Key already exists "<<endl;
    }
}

基本上,x的错误是类型定义。

// pair is in the utility header
std::pair<K, bool> x= m_map.insert(std::make_pair(key,val));