我有这个类模板,其中包含如下地图:
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;
这是正确的方法吗?
答案 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));