Толкающий вектор векторов - PullRequest
3 голосов
/ 24 марта 2009

Что-то не так с возвратом вектора векторов? как

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

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

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

Ответы [ 4 ]

6 голосов
/ 24 марта 2009

Правильно, вектор копируется, как и ожидалось. Есть хорошее программное обеспечение под названием 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 копируется в новый вектор, который создается внутри вектора многоугольников и управляется этим.

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

2 голосов
/ 24 марта 2009

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

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

2 голосов
/ 24 марта 2009

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

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

typedef vector<Point> Polygon;
typedef vector<Polygon*> Polygons;
Polygons polys;
polys.push_back(new Polygon());
1 голос
/ 24 марта 2009

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

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

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

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