Resource management - vector and pointers

I need to save a sequence of type elements ThirdPartyElm, and I use std::vector(or std::array, if I need a fixed size sequence).

I am wondering how I should initialize the sequence. The first version creates a new element and (if I'm right) creates a copy of the element when it is inserted into the sequence:

for (int i = 0; i < N; i++)
{
   auto elm = ThirdPartyElm();
   // init elm..
   my_vector.push_back(elm);  // my_array[i] = elm;
}

The second version stores a sequence of pointers (or best smart pointers with C ++ 11):

for (int i = 0; i < N; i++)
{
   std::unique_ptr<ThirdPartyElm> elm(new ThirdPartyElm());
   // init elm..
   my_vector.push_back(std::move(elm));  // my_array[i] = std::move(elm);
}

What is the lightest version?

Please indicate any errors.

+4
source share
4 answers

, . , , .

, ThirdPartyElem , .

, .

, :

  • std::move , , , , ( ). (, ), .

  • , .

for (int i = 0; i < N; i++)
{
   my_vector.emplace_back();
   try {
       auto&& elm = my_vector.back();
       // init elm..
   } catch(...) {
       my_vector.pop_back();
       throw;
   }
}

, ( ).

+1

, .

std::vector<ThirdPartyElem> my_vector(N);

( ) ,

. ele - , - , , , copy elision, move copy.a >

, , .

+6

, , , .

Cyber, elision , , std:: move.

++ 11, emplace_back - push_back, std:: move (. ), emplace_back ; , , , , , , , :

my_vector.reserve(N);
for (int i = 0; i < N; i++)
{
   auto elm = ThirdPartyElm();
   // init elm..
   my_vector.emplace_back(std::move(elm));
}

: @Chris Drew, , . , , , , -, emplace_back, :

my_vector.reserve(N);
for (int i = 0; i < N; i++)
{
  my_vector.emplace_back(ThirdPartyElm());       
  my_vector.back().initialise();  // or whatever
}

myvector.back() , , .

+1

, push_back().

, , ,

my_vector.resize(N);

, .

my_vector[i] = elem;

, :

  • push_back() , .
  • (), push_back() .
  • .
  • (N) (N), !

, , ( ) , . , .

1,2 , resize().

+1

All Articles