从C++ 11开始,std::shuffle()对随机位生成器进行右值引用:
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g);
Run Code Online (Sandbox Code Playgroud)
所以我可以这么称呼它:
std::vector<int> v = {...};
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);
Run Code Online (Sandbox Code Playgroud)
这揭示了我对C++的理解错误,我今天早上通过阅读无法满足:在这里使用右值引用可以获得什么?换句话说,为什么不这样做
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG& g);
Run Code Online (Sandbox Code Playgroud)
M.M*_*M.M 17
这是转发引用,而不是右值引用.它们具有表面上相似的语法,但可以通过基本类型作为推导出的模板参数来区分.
如果为第三个参数给出了右值,则建议的替代方法将无法编译,而转发引用允许任何值类别的参数.
使用cppreference示例,这意味着您有两个选项:
std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g);
Run Code Online (Sandbox Code Playgroud)
和
std::shuffle(v.begin(), v.end(), std::mt19937(rd()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
808 次 |
| 最近记录: |