Insertion in map using array - error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’

Insertion in map using array - error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’

我想通过以下代码在 std::unordered_map(名为 unordered)中插入两个数组的值:AT

for(int i = 0; i < N; ++i)
{   
    unordered.insert(std::make_pair<int, int>(A[i], T[i]));
}

我收到以下错误:

error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’

我猜是因为operator[] returns引用了一个变量,不然怎么办呢?

这是我的其余代码:

int N;
cin >> N;

int A[N], T[N];

std::unordered_map<int, int> unordered;

for (int i = 0; i < N; ++i)
{
    cin >> A[i];
}
for (int i = 0; i < N; ++i)
{
    cin >> T[i];
}
for (int i = 0; i < N; ++i)
{
    unordered.insert(std::make_pair<int, int>(A[i], T[i]));
}

How to do it otherwise?

你明确提供了std::make_pair的模板参数,让编译器强行选择下面的std::make_pair的重载

template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );

这不是必须的,让编译器来推导

unordered.insert(std::make_pair(A[i], T[i]));

unordered.insert({A[i], T[i]});

或使用std::unordered_map::emplace

unordered.emplace(A[i], T[i]);

请注意,AT 是可变长度数组,它们不是标准 c++ 的一部分。更多阅读:Why aren't variable-length arrays part of the C++ standard? 使用 std::vector 而不是 VLA。

话虽这么说,您真的需要将用户输入存储到一个数组中吗!您也可以直接将键值插入到地图中,如下所示:

#include <iostream>
#include <unordered_map>

int main() 
{
    int N; std::cin >> N;

    std::unordered_map<int, int> unordered;

    for (auto i = 0u; i < N; ++i)
    {
        int key{}, value{};
        std::cin >> key >> value;      // get the user input (key and value)
        unordered.emplace(key, value); // like this
        // or
        // unordered.insert(std::make_pair(key, value));
        // or
        // unordered.insert({ key, value });        
    }
}

从概念上讲,您可以使用 std::move,如下所示。

unordered.insert(std::make_pair<int, int>(std::move(A[i]),std::move( T[i])));