О векторах в отношении классов - PullRequest
2 голосов
/ 23 ноября 2011

Я не лучший в формулировке вещей, поэтому я собираюсь использовать пример, чтобы задать свой вопрос.

Если, например, я делал FPS-игру, в которой я использовал векторы для хранения пуль (это был бы отдельный класс), потому что я не знал, с какими пулями я буду иметь дело во время выполнения, как бы я получить доступ к каждому элементу вектора, чтобы отображать каждую пулю на экране столько раз в секунду (представьте, что я использую OpenGL в качестве API рендеринга, если это помогает или имеет какое-то значение).

Надеюсь, этот вопрос достаточно ясен.

Ответы [ 5 ]

4 голосов
/ 23 ноября 2011
std::vector<Bullet> v;
void usebullet(const Bullet& b)
{
    // use the members of b, such as b.x, b.y 
}

Вектор можно повторять разными способами:

for (size_t i=0; i<v.size(); ++i)
    usebullet(v[i]); // or use v[i].x, v[i].y

for (std::vector<Bullet>::const_iterator it=v.begin(); it!=v.end(); ++it)
    usebullet(*it); // or use it->x, it->y

c ++ 0x:

for (auto& bullet: v)
    usebullet(bullet);  // or use bullet.x, bullet.y

Для итерации в обратном порядке:

for (size_t i=v.size(); i>0; )
    usebullet(v[--i]);

for (std::vector<Bullet>::const_reverse_iterator it=v.rbegin(); it!=v.rend(); ++it)
    usebullet(*it);

Интересно, что диапазон , основанный на , не выполняет обратную итерацию.Вы можете использовать несколько адаптеров (включая, например, boost::range::adaptors::reversed)

3 голосов
/ 23 ноября 2011
vector<Bullet> bullets;
vector<Bullet>::iterator bullet;
for ( bullet = bullets.begin(); bullet != bullets.end(); bullet++ )
    draw_bullet(bullet->x, bullet->y, bullet->z);

(итератор - это, по сути, указатель на итерируемый элемент)

1 голос
/ 23 ноября 2011

Если std::vector<Bullet> v; - ваш вектор, скажите v[8], чтобы получить 9-й элемент. Вы можете выполнить итерацию for (std::size_t i = 0, end = v.size(); i != end; ++i), но обычным способом является использование итераторов :

for (std::vector<Bullet>::iterator it = v.begin(), end = v.end(); it != end; ++it)
{
  // now "*it" is your element
}

Не стирайте и не вставляйте элементы в вектор из цикла!

0 голосов
/ 23 ноября 2011
class Bullet {
    public:
    Bullet(int ID);
    Draw() {
        // implementation
    }
    // more implementation
};

Создание вектора:

std::vector<Bullet> bullets;

Добавление нового маркера к вектору:

bullets.push_back(Bullet(some_unique_ID_var));

Итерация по всем пулям:

for (size_t i = 0, size_t s = bullets.size(); i < s; i++) {
    bullets[i].FollowTarget();
}

// or

for (std::vector<Bullet>::const_iterator it = bullets.begin(); it != bullets.end(); it++) {
     it->Draw();
}

или если ваш компилятор поддерживает c ++ 11:

for (auto it = bullets.begin(); it != bullets.end(); it++) {
     it->Explode();
}

// or

for (Bullet& b: bullets) {
    b.UpdatePosition();
}

И просто для полноты::)

#include <algorithm>

class ChangeSpeed {
    void operator()(const Bullet& b)
    {
        // do something with b
    }
} speed_change;

std::for_each(bullets.begin(), bullets.end(), speed_change);
0 голосов
/ 23 ноября 2011
struct bullet
{
     int x;
     int y;
     int z;
};

std::vector<bullet> bullets;
for(std::vector<bullet>::const_iterator it = bullets.begin(); it != bullets.end(); ++it)
     draw_bullet(it->x, it->y, it->z);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...