c++ - std::shuffle 不能用 std::list 编译

标签 c++ list std shuffle

我正在尝试打乱一些生成元素的列表。这是代码:

std::default_random_engine generator (10);
std::list<int> list(10);

int n = 0;
std::generate(list.begin(), list.end(), [&]{ return n++; });
std::shuffle(list.begin(), list.end(), generator);

它不编译。以下是错误:

/include/c++/v1/algorithm:3059:34: Invalid operands to binary expression ('std::__1::__list_iterator<int, void *>' and 'std::__1::__list_iterator<int, void *>')
main.cpp:1:10: In file included from main.cpp:1:

/include/c++/v1/random:1641:10: In file included from /bin/../include/c++/v1/random:1641:

main.cpp:37:10: In instantiation of function template specialization 'std::__1::shuffle<std::__1::__list_iterator<int, void *>, std::__1::linear_congruential_engine<unsigned int, 48271, 0, 2147483647> &>' requested here
/include/c++/v1/iterator:622:1: Candidate template ignored: could not match 'reverse_iterator' against '__list_iterator'
/include/c++/v1/iterator:1017:1: Candidate template ignored: could not match 'move_iterator' against '__list_iterator'
/include/c++/v1/iterator:1369:1: Candidate template ignored: could not match '__wrap_iter' against '__list_iterator'
/include/c++/v1/string:486:11: Candidate template ignored: could not match 'fpos' against '__list_iterator'

有人知道吗?

最佳答案

std::list 不提供对其元素的随机访问,而 std::shuffle() 需要。这就是 std::shuffle() 的签名在其规范中的样子(C++ 标准的第 25.3.12 段):

template<class RandomAccessIterator, class UniformRandomNumberGenerator>
void shuffle(RandomAccessIterator first,
             RandomAccessIterator last,
             UniformRandomNumberGenerator&& g);

如果可以,请考虑改用 std::vector - 顺便说一句,C++ 标准本身鼓励您将其用作默认顺序容器。

例如(live demo on Coliru):

int main()
{
    std::default_random_engine generator(10);
    std::vector<int> v(10);

    std::iota(begin(v), end(v), 0);
    std::shuffle(begin(v), end(v), generator);

    for (auto x : v) { std::cout << x; }
}

std::iota() 算法只是您对 std::generate 的特定用法的一种更简单的替代方法。

关于c++ - std::shuffle 不能用 std::list 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28033901/

相关文章:

c++ - 处理大量的 Boost 头文件

c# - 如何从非常大的列表中按索引有效地删除元素?

java - 在 Java 中将 for-each 嵌套在同一个列表中?

c++ - 将输入流迭代器与数组一起使用

C++:如何创建仿函数

C++ FFmpeg 刷新后如何继续编码?

javascript - 使用 GTK+ Webkit Webview(和 Qt WebKit 桥)从 JavaScript/HTML 调用 C++

python - 如何比较 2 个相同长度列表中的确切列表元素?

c++ - regex_replace 在 Windows 上不起作用

C++ 查找 vector 中的重复符号