如何对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);
}
原文地址:https://www.cnblogs.com/demon90s/p/15564283.html