2016-11-29 3 views
2

Ich habe mehrere Container verschiedener Typen.
Ich möchte die gleiche Aktion für alle Elemente in allen Containern durchführen.
Normalerweise handelt es sich dabei mehrere bereichsbasierte for-Schleifen mit duplizierten Code:Wie kann ich mehrere Container in einem Bereich verwenden?

#include <iostream> 
#include <vector> 
#include <set> 

int main() { 

    //containers 
    std::vector<int> v1{1,2,3,4,5}; 
    std::set<float> v2{6,7,8,9,10}; 

    //perform iterations 
    for (auto & it: v1){ 
     std::cout << it << ' '; 
    } 
    for (auto & it: v2){ 
     std::cout << it << ' '; 
    } 
} 

ich diese in der Lage sein möchte, anstatt zu tun,
durch for-Schleife mehrere Container auf den gleichen Bereich Basis bereitstellt.

Dies ist natürlich nicht funktioniert:

for (auto & it: v1,v2){ 
    std::cout << it << ' '; 
} 

Gibt es eine Bibliothek Lösung, die ich dies zu erreichen, verwenden könnte?

Antwort

3

Sie boost Palette verwenden könnte combine:

for(auto&& el : boost::combine(v1, v2)) { 
    std::cout << boost::get<0>(el) << ", " << boost::get<1>(el) << '\n'; 
} 

demo

Oder range-v3 ‚s zip Ansicht:

for(auto&& el : view::zip(v1, v2)) { 
    std::cout << std::get<0>(el) << ", " << std::get<1>(el) << '\n'; 
} 

demo


Alternativ

, könnten Sie eine Reihe von zip machen Iteratoren auf die harte Tour:

auto b = boost::make_zip_iterator(boost::make_tuple(v1.begin(), v2.begin())); 
auto e = boost::make_zip_iterator(boost::make_tuple(v1.end(), v2.end())); 
for(auto&& tup : boost::make_iterator_range(b, e)) { 
    std::cout << boost::get<0>(tup) << ", " << boost::get<1>(tup) << '\n'; 
} 

demo

+0

Erwähnen möchte ich, dass es fast ausdrücklich von der Norm verboten ist, die Regeln für die Sätze _a Komma-Operator nicht neu interpretiert werden kann als Abgrenzung zwei Init-declarators_. – skypjack

+0

@skypjack Ich glaube nicht, dass ich deinen Kommentar verstehe. – krzaq

Verwandte Themen