Тип или Вектор для представления точек \ позиций - PullRequest
1 голос
/ 04 июня 2010

У меня есть ряд точек \ позиций, которые не изменятся. Должен ли я представлять как вектор целых или как новый тип?

Сейчас я предпочитаю использовать вектор:

doSomething(myVec[0], myVec[1] );
doSomethingElse(myVec[2], myVec[3] );

вместо:

doSomething( myType.getPos1(), myType.getPos2() );
doSomethingElse( myType.getPos3(), myType.getPos4() );

Есть мысли или идеи?

Спасибо

Ответы [ 5 ]

3 голосов
/ 04 июня 2010

ИМХО оптимальным решением будет:

struct Point {
  int x, y;
};

[... где-то еще ...]

vector<Point> points();

(Мой C ++ ржавый, синтаксис может быть неправильным)

3 голосов
/ 04 июня 2010

Почему бы не создать фактическую векторную структуру / класс?

Под вектором я подразумеваю математический вектор. Обычно векторы используются для точек и позиций. Бонусом этого является то, что ваш код будет гораздо более читабельным.

Вот как это делают игры, графика и другие приложения. Использование списка для связанных данных не является ОО, и одна из причин ООП существует.

3 голосов
/ 04 июня 2010

Трудно сказать с учетом информации. Но с любой информацией, предоставленной до сих пор, я бы предпочел написать struct Point с x и y координатами и создать vector точек. Это даст вам преимущества хранения объектов в стандартном контейнере, а также будет логически связывать данные в общей структуре, чтобы вам не приходилось vec[0],vec[1] каждый раз, когда вы хотите указать точку. В качестве примечания: если вы пишете класс с помощью метода getPos, я бы обязательно написал getPos(int index), а не getPos1, getPos2 и т. Д.

2 голосов
/ 04 июня 2010

Поскольку вы используете stl, я бы использовал vector< pair<int,int> > (или vector< pair<double,double> >, если точки не целые). Отлично работает для очков.

Итак, вы можете сделать что-то вроде этого:

vector< pair<int,int> > points;
points.push_back(make_pair(1,2));
points.push_back(make_pair(2,2));
1 голос
/ 04 июня 2010

Если вам нужно перебрать их, ответ очевиден.

Если они не меняются, и вы можете управлять сложностью, тогда первый вариант подойдет. Второй может быть более читабельным (если вы выбираете добрые имена).

Вы также можете написать класс, который содержит или содержит ссылку на вектор. В этом случае вы можете воспользоваться преимуществами обоих.

Вы также можете использовать библиотеку Boost.tuple.

#include <boost/tuple/tuple.hpp>

boost::tuple<int,int,int,int> position;

и доступ к ним как:

position.get<N>(); // where N is in 1,2,3,4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...