web-dev-qa-db-fra.com

Déplacement efficace du contenu de std :: unordered_set vers std :: vector

Dans mon code, j'ai un std::unordered_set et je dois déplacer les données dans un std::vector. J'utilise le std::unordered_set lors de l'obtention des données pour garantir que seules des valeurs uniques sont stockées avant la conversion en std::vector. Ma question est de savoir comment déplacer le contenu vers le std::vector le plus efficacement? Je n'ai pas besoin du std::unordered_set après le déplacement des données. J'ai actuellement les éléments suivants:

std::copy(set.begin(), set.end(), std::back_inserter(vector));
11
nalyd88

Avant C++ 17, le mieux que vous puissiez faire est de:

vector.insert(vector.end(), set.begin(), set.end());

Les éléments de set sont const, vous ne pouvez donc pas vous en éloigner - déplacer c'est simplement copier.


Après C++ 17, nous obtenons extract() :

vector.reserve(set.size());
for (auto it = set.begin(); it != set.end(); ) {
    vector.Push_back(std::move(set.extract(it++).value()));
}

Bien que, étant donné votre commentaire selon lequel vos données sont doubles, cela n'a pas d'importance.

15
Barry