0

イテレータを使用してベクトル内の位置にアクセスする最良の方法を見つけようとしています。イテレータがポインタのように振る舞うことは知っているので、これが私が思いついた唯一の方法です。良い方法や違う方法があれば教えていただきたいです。コードは次のとおりです。

   //This is a pointer to a vector of the class Particle BTW. vector < Particle > *particleList;
   vector<Particle>::iterator it = particleList->begin();
   // I assign a specific position outside the loop to a new iterator that won't be affected
   vector<Particle>::iterator it2 = particleList->begin() + 3;
   for( it; it != particleList->end(); it++){


    it->draw();
    //I'm interested in the velocity of this element in particular
    cout << it2->vel << endl;
}

ありがとう、

M

4

1 に答える 1

1

以下を試してください

for (auto i = particleList->begin(); i < particleList->begin(); ++i) {
  i->draw();
  std::cout << (i+3)->vel << "\n";
}

std::endlを使用する理由はないことに注意してください。std::endlログ ファイルに出力するときにパフォーマンスを低下させる暗黙のフラッシュがあり、コンソールに出力するときは、行末が既にフラッシュされていることを意味する、既に行バッファーされています。

注 2、 is はランダム アクセス イテレータであるため、 is aでのみ+使用できます。aに変更すると、イテレータはランダム アクセス イテレータではなく双方向イテレータになり、その場合は使用できません。 WhozCraigが述べたように使用する必要がありますが、次のようにコピーしてください:iiparticleListstd::vectorparticleListstd::list+std::advance

for (auto i = particleList->begin(); i < particleList->begin(); ++i) {
  i->draw();
  auto i2 = i;
  std::advance(i2, 3)
  std::cout << i2->vel << "\n";
}

個人的には、この場合は線形ではなくstd::advance、 2 つのイテレータで反復するだけです。std::advance次のようにします。

auto i = particleList->begin();
auto i2 = particleList->begin();
std::advance(i2, 3);
for (; i < particleList->end(); ++i, ++i2) {
  i->draw();
  std::cout << i2->vel << "\n";
}

注 3:(i+3)そしてi2、リスト (ベクトル) の最後から実行されるので、そこでスマートなことをしてください。

于 2013-10-31T08:45:01.373 に答える