2016-08-05 2 views
1

私は16000 X 9000単位のマップを持つゲームに取り組んでいます。もし私がマップ上のどの点X、Yにあっても、半径2000単位まで見ることができます。私は、特定の地域を訪問したかどうかを管理できる何かを求めていました。主な質問は、私は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の明示的な特化およびC++標準保証である:すなわち、無駄なスペースがありません

ではなくstd::vector<bool>の使用を検討しています。 には、1つの連続したメモリブロックを取得することが困難な場合は、std::vector<std::vector<bool>>が必要です。これは、すべてそうでダイビングする前に慎重にこれを考慮しない、いくつかの民族が復讐とboolベクトル特化を嫌い、と述べた。(非推奨のためにそれをスケジュール検討する動きがあります!)

それともできたあなたのグラフのエリアunsignedなどの整数型のセットにあなた自身を一緒にしてください。

+0

実際には、たとえベクトルであっても、マップの各座標をpush_backする必要がありますか? –

+0

そうではありません。ベクタに必要なスペースを割り当て、 "unvisited"に初期化するだけです。 'std :: vector :: resize'を参照してください。 – Bathsheba

+0

バイト数ではなく8ビットです – RiaD

1

発見された領域を円形にする必要がある場合は、この巨大なarryを使用する必要があります。

完全な円である必要がない場合は、単純にダウンサンプリングすることができます。つまり、10ブロックの粗さを使用すると、1600x90サイズの配列のみが必要です。

関連する問題