0
votes

Réduisez un vecteur de N1 jusqu'à N2 articles sans déclencher le constructeur par défaut et utiliser uniquement la sémantique de déplacement

Pourriez-vous m'aider avec un moyen efficace de rétrécir un std :: vecteur à partir de n1 bas vers n2 ( N2 <= n1 ) les éléments sans nécessiter t Pour avoir un constructeur par défaut (c.-à-d. redize () n'est pas une option car elle nécessite un constructeur par défaut Parce que cela peut être utilisé pour grandir aussi), et utiliser uniquement la sémantique de déplacement (sans nécessiter d'opérateur de constructeur de copie / d'affectation dans t )? Si l'opération rétrécit rétrécit la mémoire allouée est facultative (je n'ai pas encore décidé lequel est le meilleur pour mon programme).

Ce que j'ai essayé jusqu'à présent: xxx


5 commentaires

Qu'en est-il du rétrécissement pour s'adapter?


Sans nécessiter un opérateur de constructeur / d'affectation de copie dans T aucun opérateur d'attribution de déplacement?


@ Berto99, déplacez la sémantique est correct, mais la copie n'est pas.


@Oznog, strink_to_fit ne réduit pas le nombre d'éléments du vecteur - il ne réduit que la capacité du vecteur prétendument.


@Sergerogatch Oui, je pensais à effacer + Shrink_to_fit, je n'ai pas élaboré, mais une réponse lui donne.


4 Réponses :


2
votes

Qu'en est-il de quelque chose comme ça? XXX


0 commentaires

2
votes

La solution la plus simple consiste à effacer les éléments:

std::vector<T> filtered;
filtered.reserve(N2);
std::move(v.begin(), v.begin() + N2, 
          std::back_insert_iterator(filtered));
return filtered;


0 commentaires

2
votes

Si vous avez besoin de le faire en place, peut-être juste effacer code> suffira:

v.erase(v.begin() + N2, v.end());


1 commentaires

Tant qu'il a O (n1) complexité, cela semble être la meilleure réponse.



2
votes

efface code> semble le nettoyant: xxx pré>

mais option avec redimensionner code> est de fournir un objet factice: p>

auto& dummy = v[0]; // assuming non-empty, else create a new dummy object
v.resize(N2, dummy); 


0 commentaires