Pourriez-vous m'aider avec un moyen efficace de rétrécir un Ce que j'ai essayé jusqu'à présent: p> std :: vecteur
n1 code> bas vers
n2 code> (
N2 <= n1 code>) les éléments sans nécessiter
t code> Pour avoir un constructeur par défaut (c.-à-d.
redize () code> 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 code>)? 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).
4 Réponses :
Qu'en est-il de quelque chose comme ça?
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;
Si vous avez besoin de le faire en place, peut-être juste effacer code> suffira:
v.erase(v.begin() + N2, v.end());
Tant qu'il a O (n1) code> complexité, cela semble être la meilleure réponse.
mais option avec efface code> semble le nettoyant:
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);
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 i> 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 code> 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.