2016-06-26 6 views
-1

私は7桁の電話番号と名前を保持できるダイレクトアドレッシングを使用してハッシュテーブルを実装しようとしています。ベクトルのサイズを9999999に設定すると、エラーは発生しませんが、プログラムが非常に遅くなり、ほぼ停止します。最大ベクトルサイズの割り当てC++

std::vector <long long> myNumbers (9999999); 

OR

std::vector <long long> myNumbers; 
myNumbers.resize (9999999) 

の両方が失敗している、私はこれを行うことができます方法はありますか?

+4

私は、あなたはベクターの仕組みを理解していないと思います。ベクトルのサイズは、それが含むことができるオブジェクトの数です。あなたは、 'long long'型の9'999'999変数をベクトルに含めることを可能にしようとしています。何個の電話番号を入れたいのかわからない場合は、最初にサイズを変更しないでください。値を入力すると、サイズが自動的に変更されます。 1つの 'long long'変数に7桁の電話番号を格納することができます。 – Jezor

+1

「立ち往生しています」と定義します。ブランキングでは数メガバイトのメモリが高速ではありませんが、まったく遅くはありません。確かに "つまっている"ことはありません。 –

答えて

2

他のコメントと同様に、プログラムが停止するのは、多くのデータを割り当てようとしているからです。

しかし、ベクターはおそらくあなたのデータに最適なデータ構造ではありません。電話番号を保存している場合は、すべてのデータが1000000〜9999999の間にあることを意味します。したがって、配列やベクトルを使用する場合は、割り当てたすべてのスペースを利用していません。マップを使用します。

- 言ったEDIT

、あなたはあなたのデータは本当に密であることを予想される場合、配列はすべての後に、より良いかもしれません使用して、8999999個の可能性のほとんどを記入。すべてのスペースを利用するには、サイズが9,000,000の配列を作成し、数字から1,000,000を引いて挿入/検索インデックスを取得し、すべての数値を効果的に1,000,000だけシフトします。

4

std::vector<long long>(9999999)を使用する場合は、〜10M long long秒を初期化する必要があります。それぞれのlong longが8バイト長であると仮定すると、プログラムはその場で80MBのメモリをゼロにする必要があります。これは瞬間的ではありません。

80 MBのベクターを使用してもよろしいですか? std::unordered_mapまたはstd::mapのような音(キーが順番に必要かどうかによって異なります)は、使用するのに適したデータ構造です。

関連する問題