如何对list进行洗牌操作

摘要:
矢量是可以的,但列表不是。一个相对简单的方法是首先从列表中构造一个临时向量,搅乱临时向量,然后将搅乱的向量复制回原始列表。

标准库函数 std::random_shuffle 提供了一个洗牌功能,但是参数只能是随机迭代器。vector可以,但list不行。

那么如何对list进行洗牌呢?一个比较简单的方法就是先从list构造一个临时的vector,对此临时的vector进行洗牌,然后再把洗牌后的vector复制回原来的list中。

代码如下:

template<typename T>
void random_shuffle_list(std::list<T> &l) 
{
    std::vector<T> v(l.begin(), l.end());
    std::random_shuffle(v.begin(), v.end());
    l.assign(v.begin(), v.end());
}

完整测试代码:

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <algorithm>

template<typename T>
void print_list(const std::list<T> &l)
{
	std::cout << "list:";
	for (const T &item : l)
	{
		std::cout << " " << item;
	}
	std::cout << std::endl;
}

template<typename T>
void random_shuffle_list(std::list<T> &l)
{
	std::vector<T> v(l.begin(), l.end());
	std::random_shuffle(v.begin(), v.end());
	l.assign(v.begin(), v.end());
}

int main()
{
	srand(time(nullptr));

	std::list<std::string> l { "JUJU", "Demon", "Miemie", "Lee", "Mom", "Dad" };
	print_list(l);

	random_shuffle_list(l);
	print_list(l);
}

免责声明:文章转载自《如何对list进行洗牌操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇实时机器学习是什么,面临哪些挑战?IBM AIX 5.3环境里挂载ISO文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 开发 VectorDrawable 矢量图 (八)animation-list帧动画配合矢量图实现动画

前言  只是矢量图的一个使用小技巧,关键点是<aapt:attr name="android:drawable"> 属性,它其实是代替<item 里的android:drawable属性。理解它,你可以举一反三使用到更多的需要实现动画,按下效果,选择效果的xml文件上,比如一个实现按下效果的xml将原来需要3个xml文件合并成一个xml文...

Thinkphp的Volist标签

Volist标签主要用于在模板中循环输出数据集或者多维数组。 volist标签(循环输出数据) 闭合 非闭合标签 属性 name(必须):要输出的数据模板变量 id(必须):循环变量 offset(可选):要输出数据的offset length(可选):输出数据的长度 key(可选):循环的key变量,默认值为i mod(可选):对key值取模,...

基于bootstrap的局部刷新的分页

在之前的工作中我用的分页有很多,一直不牢固,所以自己用起来也不是很顺手,这是一个局部刷新的分页,我试了很多,本想用mvcPager来做局部刷新,但是考虑到成本太高,放弃了,先来总结一下基于bootstrap的分页吧,便于自己以后使用 开源地址 https://github.com/lyonlai/bootstrap-paginator 首先引用 Jquer...

记:Android NDK 的配置和使用

一、NDK配置:   从ndk r7开始,不再需要cygwin;   选择项目单击右键,点击Properties,在Builders窗口中新建一个program,输入名称;   在main标签页的location选择ndk目录中的ndk-build.cmd,在Working Directory选择当前项目;        在Refresh标签页,勾选如下选...

BZOJ 1295 最长距离(最短路)

考虑到矩阵尺寸的关系,可以枚举起点和终点,并且判断是否可行即可。 判断起点和终点是否可以通过挖空至多T个障碍联通。实际上就是求起点到终点的最短路。 所以我们先建好图,然后求以每个方格为起始点的最短路,复杂度O(n*m^2*logm). 枚举起点和终点更新答案的复杂度是O(n^2*m^2). 总复杂度就是(nm(nm+mlogm)). # include...

VC++ 复制整个文件夹

CopyFile只能复制一个文件,要想复制整个文件夹的所有文件,需要遍历文件夹里面的文件。 MyFile.h #pragma once #include <string> #include <Windows.h> #include <iostream> #include <stdio.h> #include...