我将记录插入无序地图,导致错误,下面是程序:
#include<tr1/unordered_map>
using namespace std;
int main(int argc, char *argv[])
{
std::tr1::unordered_map<int, int> u1;
int n;
cout << "Enter the no. of times" << endl;
cin >> n;
for (int i = 0; i<n; i++)
{
int no_items;
cout << "Enter no of items" << endl;
cin >> no_items;
for (int j = 0; j<no_items; j++)
{
int key, val;
cout << "key=";
cin >> key;
cout << endl << "val=";
cin >> val;
u1.insert(std::make_pair<int, int>(key, val)); //Compiler error
//u1[key]=val; //This line is working instead of insert.
}
}
return 0;
}
u1.insert(std::make_pair<int,int>(key,val));
会出错
- 无法转换&#39; key&#39; (键入&#39; int&#39;)键入&#39; int&amp;&amp;&#39;
- 没有匹配函数来调用&#39; make_pair(int&amp;,int&amp;)&#39;
想知道operator []
在unordered_map
中插入记录的工作原理是什么,而insert()
的功能却没有。
答案 0 :(得分:3)
std::make_pair
的2个参数是转发引用T&&
。只需让编译器进行类型推导:
u1.insert(std::make_pair(key,val));
答案 1 :(得分:1)
u1.insert(std::make_pair<int,int>(key,val));
如果在没有-std = c ++ 11 的情况下调用g ++,则有效
但是对于c ++ 11,我们需要给出......
u1.insert(std::make_pair(key,val));
因为早期版本的make_pair是
template <class T1,class T2>
pair<T1,T2> make_pair (T1 x, T2 y)
{
return ( pair<T1,T2>(x,y) );
}
但是从c ++ 11开始,签名是
template <class T1, class T2>
pair<V1,V2> make_pair (T1&& x, T2&& y);
答案 2 :(得分:1)
我甚至建议做一个安慰 - 节省创建临时。看看这个:
u1.emplace(key, val);