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
)中插入两个数组的值:A
和 T
:
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]);
请注意,A
和 T
是可变长度数组,它们不是标准 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])));
我想通过以下代码在 std::unordered_map
(名为 unordered
)中插入两个数组的值:A
和 T
:
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]);
请注意,A
和 T
是可变长度数组,它们不是标准 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])));