4

我正在尝试unordered_multimap使用以下代码生成大小为 10 的随机数:

#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<
       ^~~~~~~~

unordered_multimap:是否可以使用随机生成std::generate?如果没有,最好的方法是什么?

PS:我知道我应该使用std::default_random_engine而不是std::rand,并且我在真实代码中这样做,这只是为了演示目的。

4

2 回答 2

5

您的代码不能与地图一起使用。

来自文档std::generate

类型Ret必须是ForwardIt可以取消引用 type 的对象并为其分配 type 的值Ret。​</p>

您不能分配地图项的键。容器“拥有”密钥。您只能分配映射的值。这种“设置每个元素”的方法对于关联容器根本不可用。

此外,您构建了一个unordered_multimap 桶大小为 10,但没有实际元素,因此您的范围无论如何都是空的(地图不是向量!)。

你可以这样做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());
}

每个人都可以阅读这个。

于 2019-01-30T13:10:33.817 回答
5

您可以使用std::insert_iterator类模板来实现您正在寻找的内容:

auto m = std::unordered_multimap<int, int>{};

std::generate_n(std::insert_iterator(m, m.begin()),
     10, [](){ return std::pair{std::rand(),std::rand()}; }); 
于 2019-01-30T13:14:33.110 回答