Si je vous écris une bibliothèque et j'ai une fonction qui doit retourner une séquence de valeurs, je pouvais faire quelque chose comme:API C++ pour les séquences de retour d'une manière générique
std::vector<int> get_sequence();
Cependant, cela nécessite la l'utilisateur de la bibliothèque pour utiliser le conteneur std :: vector <> plutôt que de leur permettre d'utiliser le conteneur qu'ils souhaitent utiliser. En outre, il peut ajouter une copie supplémentaire du tableau retourné (selon que le compilateur pourrait l'optimiser ou non), ce qui pourrait avoir un impact négatif sur les performances.
Vous pourriez théoriquement permettre l'utilisation de conteneurs arbitraires (et éviter la copie supplémentaire inutile) en faisant une fonction basé sur un modèle qui prend un début et une iter fin:
template<class T_iter> void get_sequence(T_iter begin, T_iter end);
La fonction serait alors stocker les valeurs de séquence dans la gamme donnée par les itérateurs. Mais le problème avec ceci est qu'il vous oblige à connaître la taille de la séquence afin que vous ayez suffisamment d'éléments entre begin
et end
pour stocker toutes les valeurs dans la séquence.
Je pensais à une interface telle que:
template<T_insertIter> get_sequence(T_insertIter inserter);
qui exige que le T_insertIter soit un insert iterator (par exemple créé avec std::back_inserter(my_vector)
), mais cela semble trop facile à abuser car le compilateur heureusement accepter l'itérateur non inséré mais se comporterait incorrectement au moment de l'exécution.
Y a-t-il une meilleure pratique pour concevoir des interfaces génériques qui renvoient des séquences de longueur arbitraire?
'vector' contient également seulement un pointeur sur les données, et tout le contenu doit être copié afin d'empêcher l'aliasing. La même chose est vraie pour les listes. En outre, pourquoi est-ce "plus agréable, IMO"? Ce n'est pas du tout subjectif! Les listes sont bien adaptées lorsqu'elles nécessitent une insertion et une suppression rapides au milieu, et essentiellement pour rien d'autre. –