2016-08-05 10 views
1

나는 16000 X 9000 단위의지도를 가지고있는 게임을하고 있습니다.지도상의 어떤 지점 X, Y에 있다면, 2000 단위의 반경까지 볼 수 있습니다. 특정 지역을 방문했는지 여부를 관리 할 수있는 무언가가 필요했습니다. 주된 질문은 내가 여러 개의 bool을 가져야 하는가? 방문한 너무 큰 bool 일 것입니다 [16000 * 9000]. 고마워, 고마워. 내가 stackoverflow에 미안 해요, 내가 미안하다면 미안해.C++의 방문 좌표를위한 배열

+0

'144MB'입니다. 만약 당신이 염려한다면, 당신은'vector '을 사용할 수 있으며, 최적화 때문에 아마'18 MB' 만 필요할 것입니다. – alexeykuzmin0

+0

18MB는 요즘 많지 않습니다. – nate

+1

'16000 * 9000'은 약'137 * 2^20'이므로, 오늘날의 일반적인 개인용 컴퓨터의 RAM에 저장할 수 없을만큼 커야합니까? – MikeCAT

답변

0

bool 유형의 배열을 사용하는 것은 실제로 비효율적입니다. 주로 C++의 bool 크기가 화려하게 커질 수 있기 때문입니다. (제 플랫폼에서는 길이가 8 비트이므로 7 비트가 사용되지 않습니다.) C++ 표준은 sizeof(bool)의 값을 지정하지 않습니다.

은 사용을 고려 않는 std::vector<bool> 대신 : 더 낭비되는 공간이없는 즉이이 단단하게 포장된다 std::vector의 명시 적 전문성과 C++ 표준 보장입니다. 은 하나의 연속적인 메모리 블록을 얻기가 어려울 경우 std::vector<std::vector<bool>>이 필요합니다. 이것은 모든 너무 다이빙하기 전에주의 깊게 고려 않는 일부 사람들은 복수와 bool 벡터 전문화를 싫어했다. (중단을 위해 일정을 고려하는 움직임이있다!)

또는 수 그래프의 덩어리 지역 unsigned과 같은 필수 유형 세트로 함께 결합하십시오.

+0

실제로 벡터가 무엇인지 아직 이해하지 못합니다. 그렇다고해도 맵의 모든 좌표를 push_back해야합니까? –

+0

그렇지 않습니다. 벡터에 필요한 공간을 할당하고 "unvisited"로 초기화하면됩니다. 'std :: vector :: resize'를 보라. – Bathsheba

+0

바이트가 아닌 8 비트입니다. – RiaD

1

발견 된 영역이 원형이어야합니다 ('반경'이 사용 된 것임).이 거대한 arry를 사용해야합니다. 예.

완벽한 원 일 필요가없는 경우 간단히 말해서 10 블록의 거칠기를 사용한다고 가정하면 1600x90 크기의 배열 만 있으면 완벽한 원과 비교하여 100 배 감소됩니다.