使用数组在映射中插入 - 错误:无法将类型为“int&&”的右值引用绑定到类型为“int”的左值 [duplicate]

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

提问人:anas16 提问时间:8/11/2021 最后编辑:JeJoanas16 更新时间:8/11/2021 访问量:1103

问:

我想通过以下代码在(命名)中插入两个数组的值: and :ATstd::unordered_mapunordered

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

我收到以下错误:

错误:无法将类型为“int&&”的右值引用绑定到类型为“int”的左值

我想这是因为返回对变量的引用,但是否则该怎么做呢?operator[]

这是我的其余代码:

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]));
}
C++ 数组 无序映射 C++-标准库 std-pair

评论

0赞 NathanOliver 8/11/2021
我们能得到一个最小的可重复的例子吗?
1赞 NeonFire 8/11/2021
与其使用,不如说使用大括号std::make_pairunordered.insert({A[i], T[i]});{}
3赞 NathanOliver 8/11/2021
TL的;骗子的 DR:应该是 .让编译器为您确定类型。如果不这样做,函数将从获取转发引用更改为右值引用,这会给您带来此错误。unordered.insert(std::make_pair<int, int>(A[i], T[i]));unordered.insert(std::make_pair(A[i], T[i]));
1赞 Remy Lebeau 8/11/2021
附带说明: - 可变长度数组是非标准的。请改用。int N; cin >> N; int A[N], T[N];std::vector

答:

1赞 JeJo 8/11/2021 #1

否则怎么办?

您显式提供了模板参数,以使编译器强制选择以下 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]);

请注意,和 是可变长度数组,它们不是标准 c++ 的一部分。更多阅读:为什么可变长度数组不是 C++ 标准的一部分?代替 VLA。ATstd::vector

话虽如此,你真的需要将用户输入存储在数组之间吗?您也可以在旅途中直接将键值插入到地图中,如下所示:

#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 });        
    }
}
0赞 Pavan Chandaka 8/11/2021 #2

在认知上,您可以按如下所示使用。std::move

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