简体   繁体   中英

accessing a specific point of a vector with an iterator

I am trying to figure out the best way of accessing a position in a vector using an iterator. I'm aware iterators behave like pointers, so this is the only method I came up with. I would like to know if there's a better or just a different way. Here's the code:

   //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;
}

Thanks,

M

Try the following

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

Note, there is no reason to use std::endl , std::endl has an implicit flush which lowers performance when outputting to say a log file, and when outputting to console it is already line buffered meaning that a line ending will already flush.

Note 2, you can only use + with i since i is a random access iterator because particleList is a std::vector , if you change say particleList to a std::list then the iterator will be a bidirectional iterator instead of a random access iterator and you will not be able to use + in that case you would need to use std::advance like WhozCraig mentioned, but do so on a copy like so:

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

Though personally, in this case I would just iterate with two iterators instead of std::advance since std::advance is linear in time. Do something like:

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";
}

Note 3: (i+3) and i2 will run off the end of your list (vector), so do something smart there.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM