Как эффективно и правильно вставить объекты в вектор - PullRequest
0 голосов
/ 27 марта 2012

Предположим, я хочу объявить вектор объектов.Я могу сделать это следующим образом -

vector<mynode> nodes;

Но если размер mynode велик, это будет плохо.Поэтому я думаю сделать это следующим образом -

vector<mynode*> nodes;

Но в приведенной выше декларации есть очевидная проблема - я храню адреса, и это совсем не безопасно.Например, если я добавлю объекты в цикл foor -

vector<mynode*> nodes;
for (int i=0; i<10; i++)
{
    mynode mn;
    nodes.push_back(&mn);
}

Это приведет к ошибкам, поскольку я никогда не могу гарантировать, что содержимое указателя действительно в порядке.

Итак, ярешите использовать это объявление -

vector<mynode&> nodes;
for (int i=0; i<10; i++)
{
    mynode mn;
    nodes.push_back(mn);
}

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

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Я могу сделать это следующим образом -

vector<mynode> nodes;

Но если размер mynode большой, это будет плохо.

Нет, это будетне.Вам все равно нужно хранить объекты.Если вас беспокоит копирование крупных объектов, у вас есть несколько решений:

  1. Используйте std::vector<std::unique_ptr<my_node>> (или другой умный указатель), который автоматически освобождает объекты при уничтожении.Это лучшее решение, если my_node является полиморфным.
  2. Используйте std::vector<my_node> и используйте функцию emplace_back для создания объектов на месте (будьте осторожны, если вы используете Visual Studio 2010, эта функция не работаетчто он должен делать).
  3. Все еще используйте std::vector<my_node> и используйте push_back со ссылкой на rvalue, как в

    v.push_back(std::move(some_node));

    дляпереместить уже построенные объекты.

В любом случае, хорошим правилом является удаление конструктора / назначения копирования (или частного) для большинства не легких объектов.Контейнеры по-прежнему функционируют (при условии, что вы снова используете C ++ 11), и ваши проблемы спорны.

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

Использование ссылок дает по сути то же самое, что и использование указателей (просто вам не нужно разыменовывать их в коде). Если вы хотите автоматически убедиться, что объекты, вставленные в вектор, не будут удалены без их копирования, вам следует использовать умные указатели из boost или c ++ 11.

vector< smart_ptr<mynode> > nodes;
for (int i=0; i<10; i++)
{
    smart_ptr<mynode> mn = new mynode();
    nodes.push_back(mn);
}
0 голосов
/ 27 марта 2012

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

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