1 votes

Conversion de copies en conteneurs standard en C++

Cette question s'inscrit dans la continuité de Comment convertir un tableau en vecteur en C++ ? On m'a suggéré d'utiliser une technique très délicate avec un peu d'eau. sizeof() manipulations.

En fait, je m'attendais à trouver une fonction dans la bibliothèque standard pour convertir un tableau en n'importe quel conteneur. J'ai essayé d'en écrire une moi-même et cela ne semble pas très difficile :

#include <list>
#include <vector>

// from C-array to std-container
template<typename T, int N>
auto make_copy(auto (&from)[N]) 
    { return T{ std::begin(from), std::end(from) }; }

// from std::container to another std::container
template<typename T>
auto make_copy(const auto &from) 
    { return T{ std::begin(from), std::end(from) }; }

int main()
{
    int myArray[2] = { 1, 2 };
    auto myVector = make_copy<std::vector<int>>( myArray );
    auto myList = make_copy<std::list<int>>( myVector );
    return myList.size();
}

https://gcc.godbolt.org/z/fv4ddadax

Existe-t-il quelque chose de similaire à make_copy dans la bibliothèque standard C++ ou dans boost ?

3voto

康桓瑋 Points 5738

Vous pouvez utiliser la fonction ranges::to :

#include <range/v3/range/conversion.hpp>
#include <list>

int main() {
  int myArray[2] = {1, 2};
  auto myVector = ranges::to<std::vector>(myArray);
  auto myList = ranges::to<std::list>(myVector);
  return myList.size();
}

Démonstration.

2voto

user2079303 Points 4916

où l'on m'a suggéré d'utiliser une technique très délicate avec quelques manipulations de sizeof().

sizeof est totalement inutile pour les tableaux. Si vous avez besoin de la taille en nombre d'éléments, vous pouvez utiliser std::size . Mais dans ce cas, je recommanderais ce que vous avez utilisé dans votre exemple : (techniquement, myArray fonctionne aussi bien que std::begin(myArray) mais cette dernière est utile pour la cohérence) :

std::vector myVector(std::begin(myArray), std::end(myArray));

Existe-t-il quelque chose de similaire à make_copy dans la bibliothèque standard C++ ?

Non.

Pour votre suggestion, vous n'avez pas besoin de la surcharge de tableau car la surcharge plus générale fonctionne tout aussi bien. Vous pourriez l'améliorer un peu en utilisant std::ranges::begin y end pour prendre en charge les gammes qui ne fonctionnent pas avec std::begin y end .

ou dans le boost ?

Oui :

auto myVector = boost::copy_range<std::vector<int>>(myArray);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X