Как изменить размер std :: vector с уникальными объектами - PullRequest
3 голосов
/ 30 августа 2011

У меня есть вектор объектов. Каждый объект имеет boost::shared_ptr для не копируемого объекта (boost::signal). конструктор объекта по умолчанию создает объект boost :: signal.

struct FuncRef
{
    typedef boost::signal0<void, > Func;
    boost::shared_ptr <Func> function;
    FuncRef():
        function(new Func)
    {
    }
};

Чтобы мой вектор содержал X отдельных объектов, я сделал это: -

vec.resize(X);

Это не сделало то, что я ожидал, потому что он использует конструктор по умолчанию для создания одного объекта, а затем конструктор копирования для создания дубликатов. Я получаю X объектов, но все они указывают на один и тот же boost::signal0 объект.

Есть ли более простой способ правильно построить мой вектор, чем просто использовать push_back в цикле for?

Ответы [ 3 ]

3 голосов
/ 30 августа 2011

Единственный способ, которым я могу придумать, - это использовать reserve, чтобы вектор выделял необходимую вам память (как ответил @Jonathan).Вы можете использовать generate_n с std::back_inserter для добавления элементов:

FuncRef makeFuncRef() {
    return FuncRef();
}

vec.reserve(vec.size() + n);
std::generate(std::back_inserter(vec), n, makeFuncRef);

В этом подходе reserve не требуется, хотя, вероятно, быстрее, если n велико.

1 голос
/ 30 августа 2011

Самый простой способ, о котором я могу подумать, - это заранее зарезервировать память, чтобы vector:

требовалось только одно выделение.
vec.reserve(X);

Затем цикл и push_back(). Разве этого недостаточно для ваших нужд?

0 голосов
/ 30 августа 2011

Не можете ли вы реализовать конструктор копирования / назначение копирования с фактической семантикой копирования?Если у вас нет серьезных результатов с векторным заполнением, это кажется самым очевидным решением.

...