Attention : boost::zip_iterator
et boost::combine
à partir de Boost 1.63.0 (26 décembre 2016) provoqueront un comportement indéfini si la longueur des conteneurs d'entrée n'est pas la même (cela peut provoquer un crash ou itérer au-delà de la fin).
À partir de Boost 1.56.0 (7 août 2014), vous pouvez utiliser boost::combine
(la fonction existe dans les versions antérieures mais n'est pas documentée) :
#include
#include
#include
#include
int main() {
std::vector a {4, 5, 6};
double b[] = {7, 8, 9};
std::list c {"a", "b", "c"};
for (auto tup : boost::combine(a, b, c, a)) { // <---
int x, w;
double y;
std::string z;
boost::tie(x, y, z, w) = tup;
printf("%d %g %s %d\n", x, y, z.c_str(), w);
}
}
Cela afficherait
4 7 a 4
5 8 b 5
6 9 c 6
Dans les versions antérieures, vous pouviez définir une plage vous-même de cette manière :
#include
#include
template
auto zip(T&&... containers) -> boost::iterator_range>
{
auto zip_begin = boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
auto zip_end = boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
return boost::make_iterator_range(zip_begin, zip_end);
}
L'utilisation est la même.
0 votes
La balise
for
basée sur la plage ne peut être utilisée qu'avec une seule variable, donc non. Si vous voulez accéder à deux valeurs à la fois, vous devriez utiliser quelque chose commestd::pair
4 votes
@ SethCarnegie: pas directement, mais vous pourriez créer une fonction
zip()
qui renvoie des tuples et itérer sur la liste de tuples.2 votes
@AndréCaron vous avez raison, mon "non" voulait dire que vous ne pouvez pas utiliser deux variables, pas que vous ne pouvez pas itérer sur deux conteneurs en même temps.
0 votes
De toute évidence,
for(;;)
peut obtenir ce comportement, bien que de manière explicite, alors la question est vraiment : Est-il possible de "auto" sur deux objets à la fois?0 votes
Dans une future révision (espérons-le C++17), une refonte de la STL inclura des plages. Ensuite, view::zip pourrait fournir la solution préférée.