Является ли контейнер контейнеров плохим дизайном? - PullRequest
3 голосов
/ 06 марта 2012

Мне нужен контейнер таких контейнеров, как:

class Widget {
  ...
};
...
std::vector<std::list<Widget> > widgets;

Поскольку контейнеры STL копируют объекты в них, и копирование контейнера не является дешевой операцией, я думаю, что этот контейнер контейнеров может привести к очень плохой эффективности.и поэтому плохой дизайн.Я хочу знать, прав ли я.И если это так, я должен использовать контейнер указателей контейнера или что-то еще?Спасибо

ps

Спасибо вам, ребята, и теперь я знаю, плохой дизайн или нет, зависит от того, как я его использую.

Так что, если я знаю, сколько list (максимум) будет вставлено в vector, а затем использовать vector::reserve, чтобы избежать перераспределения vector, и после этого я просто запрашиваю объекты в нем, этоможет быть хорошим дизайном.

С другой стороны, если мне нужно время от времени вставлять list в vector, это может привести к очень плохой эффективности.

Яправо

Ответы [ 3 ]

4 голосов
/ 06 марта 2012

Это не плохой дизайн. То, как вы его используете, может быть плохим дизайном. Если ваш код требует частого глубокого копирования, и вы реализуете std::vector<std::list<Widget> *> widgets, но по-прежнему требует глубокого копирования, нет большой разницы в том, что вы делаете.

Если, например, вы очень часто запрашиваете какой-то член list в векторе, это может быть хорошим дизайном из-за близости памяти из-за компактности вектора.

Современные компиляторы с поддержкой C ++ 11, имеющие семантику перемещения, обычно перемещают данные вместо их копирования. Поэтому я не буду слишком беспокоиться о переносе или смещении векторов. «Перемещение» все еще может быть выполнено более старыми компиляторами, использующими std::swap всякий раз, когда это имеет больше смысла, чем копирование.

1 голос
/ 06 марта 2012

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

Обратите внимание, что std :: vector копирует элементы только при копировании вектора.В противном случае, когда вам нужно только увеличить емкость вектора, он использует конструкторы перемещения элементов, которые обычно дешевы.

1 голос
/ 06 марта 2012

Нет, с чего бы это?

При правильном использовании они не будут узким местом, в отличие от «простого» контейнера STL.

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

Для вашей конкретной проблемы вы можете хранить указатели вместо объектов в качестве данных.

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