2017-10-20 34 views
1

Si j'ai un std::vector de std::unique_ptr et de le redimensionner, et que je voulais ajouter un élément par index, quelle est la meilleure façon de les ajouter en utilisant operator=?Utilisation de l'opérateur d'affectation avec le vecteur de unique_ptr

std::vector<std::unique_ptr<item>> _v; 
_v.resize(100); 
// is it safe to use the assignment operator? 
_v[20] = new item; 
+0

Pensez-vous qu'il y a plusieurs façons de choisir? –

+0

la plupart des tutoriels parlent de l'utilisation de façons uniques et des moyens d'éviter de s'assurer qu'il n'y a pas d'inconvénient avec l'opérateur =. – devcodexyz

+1

Soyez prudent avec les traits de soulignement précédents. Ils sont souvent réservés à l'utilisation de la bibliothèque. Lecture pratique: [Quelles sont les règles d'utilisation d'un trait de soulignement dans un identifiant C++?] (Https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in- ac-identifier) ​​ – user4581301

Répondre

1

Vous pouvez utiliser std::make_unique si vous utilisez 14 C++, comme

_v[20] = std::make_unique<item>(/* Args */); 

Sinon, si vous êtes sous C++ 14, vous pouvez créer votre propre implémentation de std::make_unique ou utiliser le constructeur de std::unique_ptr

_v[20] = std::unique_ptr<item>(new item(/* Args */)); 
1

std::unique_ptr ne dispose pas d'un opérateur d'affectation qui prend un pointeur brut.

Mais il a un opérateur d'affectation qui se déplace d'un autre std::unique_ptr, que vous pouvez créer à l'aide std::make_unique():

_v[20] = std::make_unique<item>(); 
+2

Notez que 'std :: make_unique()' a été ajouté en C++ 14. Pour C++ 11, vous pouvez utiliser '_v [20] = std :: unique_ptr (nouvel élément);' à la place. –