2017-01-21 7 views
0

나는 카드 게임을 프로그래밍하는 중입니다. 이 카드 게임에서는 덱을 섞어 놓고 싶습니다. 데크는 고유의 포인터의 벡터이며,이 같은 외모 : 나는에서 셔플 기능을 임의의 순서를 얻기 위해 노력std :: shuffle을 사용하여 임의의 순서로 고유 포인터로 벡터를 임의로 셔플 할 수 있습니까?

std::vector<std::unique_ptr<Cards>> _deck; 

을하지만, 나는 다음과 같은 오류 있어요 : 표준 "함수 템플릿 없음 인스턴스를":: 셔플. ""인수 벡터와 일치 ". 인수에 대한 아래의 코드 블록을 볼 수 있습니다.

std::shuffle(_buildings_deck.begin(), _buildings_deck.back(), std::default_random_engine{}); 

을 지금까지, 난 여전히 임의의 엔진을 선택해야 내가 올바른 사용하고 인수를 볼 수 있지만, 그것은 문제가되어서는 안됩니다. 그래서 셔플을 사용하여 임의의 고유 한 포인터 벡터를 임의로 주문할 수 있는지 궁금합니다.

+0

reference_wrapper (http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper)의 벡터 (또는 목록)를 섞습니다. –

+0

'Card'가 정수가 아닌 이유가 있습니까? 왜 여기에 힙 할당 된 것들을 사용하고 있습니까? –

+0

@JesperJuhl이 코드 조각을 사용해 보았습니다. "std :: vector > ref (_buildings_deck.begin(), _buildings_deck.end()); \t std :: shuffle (ref.begin(), ref.end(), std :: mt19937 {std :: random_device {}()}); ". 하지만 이제는 삭제 된 함수를 참조하려고 시도하는 중 오류가 발생했습니다. 좋은 복사 생성자가없는 동안 변수를 복사하려고 할 때 일반적인 오류라는 것을 알고 있습니다. 그리고 고유 한 포인터를 사용하기 때문에 변수를 복사 할 수 없습니다. 그래서 그게 문제일까요? 또는 나쁜 코드를 작성 했습니까? – user3473161

답변

5

std :: shuffle()은 std :: vector에있는 임의 액세스 반복기를 필요로합니다. std :: list를 std :: vector로 대체해야합니다.

+1

임의 액세스 반복기가 수행합니다. std :: array, std :: deque 및 std :: vector를 사용할 수 있습니다. –

+0

그는 단지 reference_wrapper의 벡터를 만든 다음 그 목록을 섞은보기를 얻기 위해 임의로 섞을 수 있습니다. –