unordered_map :: insert vs operator [] =函数给出错误

时间:2016-02-16 18:05:44

标签: c++ unordered-map

我将记录插入无序地图,导致错误,下面是程序:

#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()的功能却没有。

3 个答案:

答案 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);