随机 unordered_multimap 使用 std::generate
Random unordered_multimap using std::generate
我正在尝试使用以下代码生成大小为 10 的随机 unordered_multimap
:
#include <algorithm>
#include <unordered_map>
#include <cstdlib>
int main()
{
auto m = std::unordered_multimap<int, int>(10);
std::generate(
m.begin(),
m.end(),
[](){return std::pair{std::rand(),std::rand()};}
);
}
但是编译不会报错
In file included from /usr/include/c++/7/algorithm:62:0,
from main.cpp:2:
/usr/include/c++/7/bits/stl_algo.h: In instantiation of ‘void std::generate(_FIter, _FIter, _Generator) [with _FIter = std::__detail::_Node_iterator<std::pair<const int, int>, false, false>; _Generator = main()::<lambda()>]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',11)">main.cpp:11:5</span>: required from here
/usr/include/c++/7/bits/stl_algo.h:4438:11: error: use of deleted function ‘std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(typename std::conditional, std::is_copy_assignable<_T2> > >::value, const std::pair<_T1, _T2>&, const std::__nonesuch_no_braces&>::type) [with _T1 = const int; _T2 = int; typename std::conditional, std::is_copy_assignable<_T2> > >::value, const std::pair<_T1, _T2>&, const std::__nonesuch_no_braces&>::type = const std::pair&]’
*__first = __gen();
~~~~~~~~~^~~~~~~~~
In file included from /usr/include/c++/7/utility:70:0,
from /usr/include/c++/7/unordered_map:38,
from main.cpp:1:
/usr/include/c++/7/bits/stl_pair.h:378:7: note: declared here
operator=(typename conditional<
^~~~~~~~
Q: 是否可以使用std::generate
生成随机unordered_multimap
?如果没有,最好的方法是什么?
PS:我知道我应该使用 std::default_random_engine
而不是 std::rand
,我在实际代码中这样做,这只是为了演示目的。
您的代码无法使用地图。
来自documentation for std::generate
:
The type Ret
must be such that an object of type ForwardIt
can be dereferenced and assigned a value of type Ret
.
您不能分配地图项的键。容器 "owns" 键。您只能分配映射值。
此外,您构建了一个 unordered_multimap
with bucket size 10, but no actual elements,所以您的范围无论如何都是空的(地图不是矢量!)。
你可以用 std::inserter
:
#include <algorithm>
#include <iterator>
#include <unordered_map>
#include <cstdlib>
int main()
{
std::unordered_multimap<int, int> m;
std::generate_n(
std::inserter(m, m.begin()),
10,
[](){ return std::pair{std::rand(), std::rand()}; }
);
}
...但是,老实说,只是循环执行此操作并继续前进。 ;)
#include <unordered_map>
#include <cstdlib>
int main()
{
std::unordered_multimap<int, int> m;
for (size_t i = 0; i < 10; i++)
m.emplace(std::rand(), std::rand());
}
每个人都可以阅读。
您可以使用 std::insert_iterator
class 模板来实现您想要的:
auto m = std::unordered_multimap<int, int>{};
std::generate_n(std::insert_iterator(m, m.begin()),
10, [](){ return std::pair{std::rand(),std::rand()}; });
我正在尝试使用以下代码生成大小为 10 的随机 unordered_multimap
:
#include <algorithm>
#include <unordered_map>
#include <cstdlib>
int main()
{
auto m = std::unordered_multimap<int, int>(10);
std::generate(
m.begin(),
m.end(),
[](){return std::pair{std::rand(),std::rand()};}
);
}
但是编译不会报错
In file included from /usr/include/c++/7/algorithm:62:0,
from main.cpp:2:
/usr/include/c++/7/bits/stl_algo.h: In instantiation of ‘void std::generate(_FIter, _FIter, _Generator) [with _FIter = std::__detail::_Node_iterator<std::pair<const int, int>, false, false>; _Generator = main()::<lambda()>]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',11)">main.cpp:11:5</span>: required from here
/usr/include/c++/7/bits/stl_algo.h:4438:11: error: use of deleted function ‘std::pair<_T1, _T2>& std::pair<_T1, _T2>::operator=(typename std::conditional, std::is_copy_assignable<_T2> > >::value, const std::pair<_T1, _T2>&, const std::__nonesuch_no_braces&>::type) [with _T1 = const int; _T2 = int; typename std::conditional, std::is_copy_assignable<_T2> > >::value, const std::pair<_T1, _T2>&, const std::__nonesuch_no_braces&>::type = const std::pair&]’
*__first = __gen();
~~~~~~~~~^~~~~~~~~
In file included from /usr/include/c++/7/utility:70:0,
from /usr/include/c++/7/unordered_map:38,
from main.cpp:1:
/usr/include/c++/7/bits/stl_pair.h:378:7: note: declared here
operator=(typename conditional<
^~~~~~~~
Q: 是否可以使用std::generate
生成随机unordered_multimap
?如果没有,最好的方法是什么?
PS:我知道我应该使用 std::default_random_engine
而不是 std::rand
,我在实际代码中这样做,这只是为了演示目的。
您的代码无法使用地图。
来自documentation for std::generate
:
The type
Ret
must be such that an object of typeForwardIt
can be dereferenced and assigned a value of typeRet
.
您不能分配地图项的键。容器 "owns" 键。您只能分配映射值。
此外,您构建了一个 unordered_multimap
with bucket size 10, but no actual elements,所以您的范围无论如何都是空的(地图不是矢量!)。
你可以用 std::inserter
:
#include <algorithm>
#include <iterator>
#include <unordered_map>
#include <cstdlib>
int main()
{
std::unordered_multimap<int, int> m;
std::generate_n(
std::inserter(m, m.begin()),
10,
[](){ return std::pair{std::rand(), std::rand()}; }
);
}
...但是,老实说,只是循环执行此操作并继续前进。 ;)
#include <unordered_map>
#include <cstdlib>
int main()
{
std::unordered_multimap<int, int> m;
for (size_t i = 0; i < 10; i++)
m.emplace(std::rand(), std::rand());
}
每个人都可以阅读。
您可以使用 std::insert_iterator
class 模板来实现您想要的:
auto m = std::unordered_multimap<int, int>{};
std::generate_n(std::insert_iterator(m, m.begin()),
10, [](){ return std::pair{std::rand(),std::rand()}; });