Следующая программа распечатывает перемешанную колоду карт (как целые числа):
#include <array>
#include <algorithm>
#include <random>
#include <iostream>
typedef unsigned int card;
typedef std::array<card, 52> deck;
auto shuffled_deck(){
deck d = {};
std::iota(d.begin(), d.end(), 0);
std::shuffle(d.begin(), d.end(), std::default_random_engine());
return d;
}
int main(){
for(auto& i: shuffled_deck()) std::cout << i << ", ";
}
Составлено с g++ -std=c++17
программа запускается и печатает:
18, 34, 27, 46, 11, 3, 12, 19, 33, 21, 41, 13, 36, 49, 40, 22, 8, 9, 28, 2, 6, 30, 50, 24, 37, 32, 35, 4, 15, 45, 47, 43, 14, 44, 20, 23, 29, 7, 31, 51, 26, 10, 42, 48, 0, 38, 5, 16, 17, 1, 25, 39,
Это здорово, но интуиция говорит мне, что эта колода может быть создана во время компиляции, поэтому я делаю shuffled_deck
метод constexpr
constexpr auto shuffled_deck(){
deck d = {};
std::iota(d.begin(), d.end(), 0); // Error! Iota isn't constexpr!
std::shuffle(d.begin(), d.end(), std::default_random_engine());
return d;
}
Компилирование с g++ -std=c++17
выдает ошибку компиляции, говоря, что std::iota
не является constexpr
, У меня вопрос почему? конечно std::iota
определяется во время компиляции. Стандартная библиотека отстает от этой функции?
Это следует предложить добавить в стандарт. Как сейчас, так и нет.
Других решений пока нет …