C ++ дизайн: контейнер экземпляров и указателей - PullRequest
0 голосов
/ 10 апреля 2010

Мне что-то интересно.

У меня есть класс Polygon, который составляет вектор Line (другой класс здесь)

class Polygon
{
  std::vector<Line> lines;

public:
  const_iterator begin() const;

  const_iterator end() const;

}

С другой стороны, у меня есть функция, которая вычисляет вектор указателей на строки и на основе этих строк должна возвращать указатель на Polygon.

 Polygon* foo(Polygon& p){

  std::vector<Line> lines = bar (p.begin(),p.end());

  return new Polygon(lines);

 }

Вот вопрос:

Я всегда могу добавить полигон (вектор

Есть ли лучший способ, чем разыменование каждого элемента вектора и присвоение его существующему векторному контейнеру?

//for line in vector<Line*> v
//vcopy is an instance of vector<Line>
vcopy.push_back(*(v.at(i))

Я думаю, что нет, но мне не очень нравится такой подход.

Надеюсь, я смогу убедить автора класса изменить его, но сейчас я не могу основать свое кодирование на этом факте (и я боюсь падения производительности).

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 10 апреля 2010

Вы можете transform() контейнер:

struct deref { // NO! I don't want to derive, LEAVE ME ALONE!
    template<typename P>
    const P& operator()(const P* const p) const { return *p; }
};

// ...
    vector<Line*> orig; // assume full ...
    vector<Line> cp(orig.size());
    transform(orig.begin(), orig.end(), cp.begin(), deref());
0 голосов
/ 10 апреля 2010

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

vcopy( deref_iter( v.begin() ), deref_iter( v.end() ) );

будет делать то, что вы хотите. Однако это не намного проще, чем у вас, и простую функцию, которая берет указатель-вектор и возвращает объект-вектор, было бы проще реализовать и использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...