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