イテレータを使用してセットを通過し、そのセットのメンバーで何かをしようとしています(存在する場合)。問題は、通常はこれが機能することですが、空のセットの最初と最後を比較して、それらが等しくないことが判明することがあります。
対象のコード スニペットは次のとおりです。
for(int i=0;i<input_data.num_particles();i++)
{
//loop through pairs contained in particle i's Verlet list
set<int>::iterator iter;
for(iter=verlet_vars.verlet()[i].begin();iter!=verlet_vars.verlet()[i].end();iter++)
{
//call the force() function to calculate the force between the particles
force(particles.getpart(i),particles.getpart(*iter),input_data,*iter);
}
}
verlet_vars.verlet()[i] に含まれるセットが空であっても、プログラムは反復子をセットの末尾と比較し、それらが等しくないことを検出し、内部ループに入ります (最終的にプログラムがクラッシュします)。 force() 関数を呼び出そうとすることによって)。奇妙なのは、内部ループが呼び出される前にイテレータで何かを行う場合です。たとえば、次のようにします。
iter=verlet_vars.verlet()[i].begin();
その後、内側のループの比較は常に true を返し、プログラムは正常に実行されます。
PS コマンド verlet_vars.verlet()[i] はセットのベクトルを呼び出すため、[i]
verlet() 関数:
std::vector<std::set<int> > verlet() const {return _verlet;}
御時間ありがとうございます。