在各种程序语言中都提供了将容器元素随机排序的shuffle方法,c++也不例外。

不过c++将shuffle放在了<algorithm>中而不是像其他语言一样在random里,同时c++17删除了原先的random_shuffle新的程序应该使用c++11添加进去的std::shuffle。其中一个好处是新的函数在可以自定义随机数生成方法的同时保证了更好的安全性。

先来看下新函数的原型:

template< class RandomIt, class URBG >
void shuffle( RandomIt first, RandomIt last, URBG&& g );

其中firstlast指定需要随机排序的范围,g是一个“UniformRandomBitGenerator”,就是一个可以产生规定范围内的随机数的可调用对象。

所以g可以是std::random_device或者像std::default_random_engine这样的随机数引擎,也可以是std::mt19937这样的标准库提供的随机数生成器的对象,它们都在<random>中。

shuffle调用后目标容器内的元素排列顺序会被随机打乱,我们看个例子。

首先是两个帮助函数,避免做一些重复劳动:

// 帮助函数,打印vector的内容
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &v)
{
os << "{ ";
for (const auto &i: v) {
os << i << ", ";
}
os << "}"; return os;
} // 帮助函数,生成一个符合UniformRandomBitGenerator要求的随机数生成器;
// std::random_device虽然符合要求但是只适合于生成seed及安全要求较高的场合,因为速度可能很慢。
// 所以我们选择std::mt19937算法,你可以自己选择其他合适的算法
auto get_URBG()
{
std::random_device rd;
// 使用random_device生成seed
std::mt19937 g(rd()); return g;
}

然后我们分别打乱一个std::vector<int>std::vector<std::string>容器内元素的排列顺序:

// 随机排序容器内元素,打印随机排序前和随机排序后的容器内容
template <typename T>
void shuffle_container(std::vector<T> &container)
{
std::cout << "before shuffle: " << container << std::endl;
std::shuffle(container.begin(), container.end(), get_URBG());
std::cout << "after shuffle: " << container << std::endl;
} int main()
{
std::vector<int> ivec{1,2,3,4,5};
shuffle_container(ivec); // 分割线
std::cout << std::string(40, '-') << std::endl; std::vector<std::string> svec{"a", "b", "c", "d", "e", "f", "g"};
shuffle_container(svec);
}

我们编译写好的程序,然后运行:

可以看到元素都已经被随机排序了。

c++随机排序容器中的元素的更多相关文章

  1. ShuffleElements(随机打乱数组中的元素)

    给定一个数组,随机打乱数组中的元素,题意很简单直接上代码: package Array; import java.util.Arrays; import java.util.Collections; ...

  2. Leetcode算法【34在排序数组中查找元素】

    在之前ARTS打卡中,我每次都把算法.英文文档.技巧都写在一个文章里,这样对我的帮助是挺大的,但是可能给读者来说,一下子有这么多的输入,还是需要长时间的消化. 那我现在改变下方式,将每一个模块细分化, ...

  3. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  4. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  5. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  6. 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)

    序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...

  7. 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  8. Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)

    题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

  9. 删除STL容器中的元素

    有关stl容器删除元素的问题,错误的代码如下: std::vector<struct> mFriendList; ... std::vector<struct>::iterat ...

随机推荐

  1. centos7安装libgdiplus。netcore生成验证码,处理图片

    yum install autoconf automake libtool yum install freetype-devel fontconfig libXft-devel yum install ...

  2. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

  3. C语言实现十六进制字符串转数字

    代码: int StringToInt(char *hex) { ]) * + CharToInt(hex[]); } int CharToInt(char hex) { ') '; if (hex& ...

  4. 将wiki人脸数据集中的图片按男女分类

    import shutil f_in = 'D:/wiki_crop' # 读取文件中图片信息根据性别分类图片到对应目录中 dirroot = "D:/" f = open(dir ...

  5. 使用Akka的远程调用

    概述 正如其它RPC或者RMI框架那样,Akka也提供了远程调用的能力.服务端在监听的端口上接收客户端的调用.本文将在<Spring与Akka的集成>一文的基础上介绍Akka的remote ...

  6. Java开发必须掌握的线上问题排查命令

    作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题.这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查.由于在生产环境中,一般没办法 ...

  7. 软件测试自动化的最新趋势对开源测试管理软件ITEST的启示

    https://www.infoq.cn/article/c-LHJS2ksuDxp1WkrGl4 理面提到几点,DevOps 的关键原则是开发团队.测试团队和运营团队协作,无缝发布软件.这意味着集中 ...

  8. api接口参数问题

    对于取数据,我们使用最多的应该就是get请求了吧.下面通过几个示例看看我们的get请求参数传递. 回到顶部 1.基础类型参数 [HttpGet] public string GetAllChargin ...

  9. [PHP] sys_get_temp_dir()和tempnam()函数报错与环境变量的配置问题

    1.项目运行过程中遇到个问题,保存临时文件时,一直返回false 2.根据经验这个是在/tmp目录下建立临时文件,所以检查了一遍权限问题,发现权限没有问题 3.查出sys_get_temp_dir() ...

  10. Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...