7

私は数か月間 C++ に頭を悩ませていましたが、ほとんどの場合、C++ クエリでスタック オーバーフローが発生するように Google から指示されました。「なぜベクトルを使わないのか」というタイプの勧めを頻繁に目にし、まさにそうするように促されました。

したがって、主に、自動メモリ割り当て解除のマイナーな利点を得て、並べ替え用の型付き比較関数を記述できるようにするためです。オブジェクトへのポインタの配列をベクトルに切り替えました。ここで、ベクトルは多かれ少なかれ配列のように使用できると考えた (誤って思われる) ため、次のように初期化しました。

cluster  clusters[LOTS];
vector<cluster *> pclust;
pclust.reserve(numClust);
for (int i=0; i<numClust; ++i)
    pclust[i] = clusters + i;

コンパイラからの苦情はありません。それからしばらくして、クラスター オブジェクトの属性でベクターを並べ替える必要があります。そう:

std::sort(pclust.begin(), pclust.end(), ClusterCompareNumSegs);

ここでもコンパイルに問題はありません。ベクトルがソートされないことを除いて。vector.size() がゼロであることが判明しました。もちろん、私の初期化は

pclust.push_back(clusters + i);

これは簡単に修正できますが、最初の誤った割り当てが機能していたため、混乱しています。次のように、配列構文を使用して、ベクトルを正常に反復処理しました。

for (clustind=0; clustind < numClust; ++clustind) {<br>
    cluster *cl = pclust[clustind];
    ...happily access *cl...

そして、それはすべてうまくいきました。だから私は何が起こっているのだろうかと思っています。おそらく、最初の割り当てで、まだベクターに含まれていない要素にアクセスしようとしていた (それらを入れようとしていた) と、ベクターは無視していた例外をスローしていました。それにもかかわらず、場所を参照するとき、ポインターはそこにありました。誰でも啓発を提供できますか?

4

4 に答える 4

11

vector::reserveベクトルのサイズは変更されません。作成時の0要素のみが含まれています。それが行うことは、ベクトルがnumClust再割り当てすることなく保持できる可能性があることを確認することです。ここを参照してください。

あなたが望むのは、ベクトルがそのサイズを持つように宣言することです

vector<cluster *> pclust(numClust);

またはベクトルのサイズを変更するには

pclust.resize(numClust);
于 2012-05-30T07:59:48.623 に答える
5

std::vector::reserve ベクトル コンテナの要素に割り当てられたストレージ スペースの容量が、少なくとも n 個の要素を保持するのに十分であることを要求します。ベクトルのサイズを変更するわけではありませんstd::vector::resize

に置き換えpclust.reserve(numClust);ますpclust.resize(numClust);

または、呼び出しを削除pclust.reserve(numClust);して、このベクトルの構成を次のように変更することもできますvector<cluster *> pclust(numClust);。これにより、同じ結果が得られます。

また、この質問を確認することをお勧めします: std::vector reserve() と push_back() は、resize() と配列インデックスよりも高速です。なぜですか? :)

于 2012-05-30T08:00:29.950 に答える
0
cluster  clusters[LOTS];
vector<cluster *> pclust(numClust);
for (int i = 0; i < numClust; ++i)
  pclust[i] = clusters + i;

ただし、これは、クラスターを格納するためにまだ配列を使用していることを意味します。clustersベクトルを作れませんか?

vector<cluster> clusters(LOTS);
于 2012-05-30T08:18:55.067 に答える
0

vector で使用される operator[] は、index-position の要素への参照を返します。しかし、ベクトルを値で初期化していないため、空でした。

を実行しましたpclust.reserve(numClust)が、ベクトルのサイズがすぐに変更されることだけを示しており、ベクトルのサイズをまだ変更せずにストレージスペースを割り当てています。

于 2012-05-30T08:02:01.897 に答える