【问题标题】:unordered_map::insert vs operator []= function giving errorunordered_map::insert vs operator []= 函数给出错误
【发布时间】:2016-02-16 18:05:44
【问题描述】:

我正在将记录插入到无序的地图中,这会导致错误,下面是程序:

#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&lt;int,int&gt;(key,val)); 报错

  • 无法将“key”(类型“int”)转换为类型“int&&”
  • 没有匹配的函数调用'make_pair(int&, int&)'

想知道operator [] 用于将记录插入unordered_map 是如何工作的,而insert() 是如何工作的。

【问题讨论】:

  • 你试过写u1.insert(std::pair&lt;int,int&gt;(key,val));吗?
  • 得到了答案,刚接触编程,所以没有正确理解。

标签: c++ unordered-map


【解决方案1】:

std::make_pair 的 2 个参数是转发引用 T&amp;&amp;。只需让编译器进行类型推导即可:

u1.insert(std::make_pair(key,val));

【讨论】:

  • 因为我们正在处理模板,所以它们转发引用而不是右值引用。
【解决方案2】:
u1.insert(std::make_pair<int,int>(key,val));

如果在没有 -std=c++11 的情况下调用 g++ 则有效

但是对于 c++11,我们需要给出 as...

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

【讨论】:

    【解决方案3】:

    我什至建议做 emplace - 以节省创建临时的费用。看看这个:

    u1.emplace(key, val);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-08
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多