2009-03-24 5 views
3

Есть ли что-то не так с отталкиванием вектора векторов? какНадвигающийся вектор векторов

typedef vector<Point> Polygon; 
vector<Polygon> polys; 
polys.push_back(some_poly); 

Все элементы в some_poly будут скопированы правильно?

У меня есть ошибка в моем коде, и я не могу понять, что с ним не так.

ответ

2

Да, это должно работать нормально, до тех пор, как вы определили конструктор копирования и оператор присваивания для вашего Point class (и обеспечил, что они делают правильные вещи и т. Д.). std :: vector будет просто отлично, так что ошибка должна быть в другом месте - очевидно, нам понадобится дополнительная информация, чтобы помочь дальше.

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

+0

Полигон «класс» (на самом деле typedef) уже имеет хороший конструктор копий. Вероятно, вы имеете в виду класс Point. – ahy1

+0

Да, я сделал.Спасибо за это - исправились :-) – Peter

2

Ничего плохого в этом нет. Это не самая эффективная структура для вставок/стираний, но это определенно должно работать.

Если вы заинтересованы в создании вставки/подчистки более эффективным, вероятно, вы должны переключиться:

typedef vector<Point> Polygon; 
typedef vector<Polygon*> Polygons; 
Polygons polys; 
polys.push_back(new Polygon()); 
+0

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

+0

Я осмелюсь сказать, что класс «Полигоны» должен быть владельцем и может обрабатывать освобождение. Управление ресурсами не так уж плохо, если вы придерживаетесь четких правил владения. Но ваша точка верна. –

6

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

{ 
    using namespace tracked; 
    typedef vector<B> poly_t; 
    poly_t poly(3); // contains 3 B's 
    vector<poly_t> v; 
    v.push_back(poly); 
} 

отслеживает создание/копии tracked::B. Вот результат:

B0* B1*(B0) B2*(B0) B3*(B0) B0~ B4*(B1) B5*(B2) B6*(B3) B4~ B5~ B6~ B1~ B2~ B3~ 

Это выход, когда мы только отслеживать v.push_back:

B4*(B1) B5*(B2) B6*(B3) 

Как вы видите, первый B0 создается в качестве аргумента по умолчанию вектора конструктора. Затем этот объект копируется в 3 B и после этого B0 снова уничтожается, когда возвращается конструктор. Затем создается poly. Затем мы перетаскиваем его в вектор полигонов. Аргумент, poly, копируется в новый вектор, который создается внутри вектора многоугольников и управляется им.

Если он падает, проблема, вероятно, лежит в пределах другой части вашей программы. Проверяет, что конструктор/конструктор и деструктор копирования работают правильно и что они не удаляют дважды, если вы используете динамическое распределение памяти.

+0

Спасибо за подробный ответ! Тогда это должна быть логическая ошибка. Неправильные элементы копируются, но это другой вопрос. – mpen

1

Хотя нет ничего страшного в векторе векторов, вы можете взглянуть на Boost.MultiArray. Это может быть более эффективным.

typedef boost::multi_array<Point, 2> Polygons; 

Другая идея заключается в том, что вы можете сделать многоугольник реальный класс (возможно, содержащий вектор), чтобы обеспечить более адаптированные методы, чем те, которые предусмотрены по умолчанию с станд :: вектор.

Смежные вопросы