über zwei vectoren gleichzeitig iterieren?



  • Wie meinen?



  • Kellerautomat schrieb:

    Wie meinen?

    Je nach dem, unterstützt die Version seines Compilers die er installiert hat (vielleicht hat er ja GCC 4.4 oder so) automatic type deduction vielleicht noch nicht 🙂



  • Dann ist er aber selbst Schuld. Soll er halt updaten.



  • Also ich finde diese Diskussion über C++11 ein wenig verwunderlich. Es gibt Situationen, da kann man nicht einfach so mal schnell updaten. Im professionellen Bereich ist es üblich, gut abgehangene Software zu verwenden. Und das sehr lange. Bis ich mal auf der Arbeit C++11 verwenden kann, wird wohl noch 2-3 Jahre vergehen.

    Bei uns wird der Compiler nicht einfach mal aktualisiert. Das geschieht nur, wenn die Hardware mal erneuert wird.

    Man denke auch mal an Red Hat Linux oder andere Linux Distributionen, die länger gewartet werden. Da wird auch noch Software entwickelt.



  • Der TE ist offensichtlich keinprofessioneller Softwareentwickler...



  • versuchs mal so:

    typename std::vector<int>::iterator it1 = vec1.begin();  // auto it1 = vec1.begin();
    typename std::vector<char>::iterator it2 = vec2.begin(); // auto it2 = vec2.begin();
    for (; it1 != vec1.end() && it2 != vec2.end(); ++it1, ++it2)
        std::cout << *it1 << ", " << *it2 << std::endl;
    

    Die Anforderung, dass es der gleiche Typ und die gleiche Größe sein muss ist
    Quatsch.

    Kellerautomat schrieb:

    Der TE ist offensichtlich keinprofessioneller Softwareentwickler...

    Kein Grund, trotzdem sollte man sowohl C++11 als auch C++03 zu kennen.



  • M10n schrieb:

    wenn man das nicht gewusst hat und immer ausgeschrieben hat fühlt das sich wie betrug an.

    Naja, so lange gibt's das auch nicht. Erst seit einem Jahr. 😉 Es ist ein C++2011 Feature.



  • Kellerautomat schrieb:

    Der TE ist offensichtlich keinprofessioneller Softwareentwickler...

    ne isser nicht. 😉
    allerdings bin ich trotzdem an die compiler gebunden die mir das rz auf den rechenknechten und lokal mein arbeitsrechner bietet. und das ist im einen fall ein mac mit 4.2.1 und sonst 4.4.5. deswegen geht auto bei dem problem nicht.
    aber trotzdem gut die ganzen leckeren neue(re)n features zu kennen.

    Cyres schrieb:

    Die Anforderung, dass es der gleiche Typ und die gleiche Größe sein muss ist
    Quatsch.

    danke , dachte ich mir und hab ich jetzt auch schon anders gemacht. ich kannte die syntax mit dem komma nicht.



  • Der Kommaoperator ist auch ungerne gesehen.
    man kann es auch so schreiben: (ungetestet)

    typename std::vector<int>::iterator it1 = vec1.begin();  // auto it1 = vec1.begin();
    typename std::vector<char>::iterator it2 = vec2.begin(); // auto it2 = vec2.begin();
    
    while (it1 != vec1.end() && it2 != vec2.end())
    {
        std::cout << *it1 << ", " << *it2 << std::endl;
        ++it1;
        ++it2:
    }
    


  • Cyres schrieb:

    Der Kommaoperator ist auch ungerne gesehen.

    hat der ausser unübersichtlichkeit sonst noch nachteile?



  • Cyres schrieb:

    Der Kommaoperator ist auch ungerne gesehen.

    Von wem? Wenn man zwei Iteratoren/Zählvariablen gleichen Typs für die for-schleife braucht, ist das Komma im for-Initialisierer (was an der Stelle kein Komma-Operator ist) völlig ok. Der Komma-Operator im Inkremetierungs-Ausdruck ist ein Notwendiges Übel, aber auch völlig ok. Vor allem ist er kein Grund, auf eine While-Schleife auszuweichen.

    man kann es auch so schreiben: (ungetestet)

    Wenn du nicht halbwegs sicher bist solltest du nicht ungetesten Code für Anfänger posten 😉 die typenames sind überflüssig/falsch. Das ständige flushen von cout mit std::endl ist im Übrigen auch eine Unsitte...

    std::vector<int>::iterator it1 = vec1.begin();  // auto it1 = begin(vec1);
    std::vector<char>::iterator it2 = vec2.begin(); // auto it2 = begin(vec2);
    
    for (;it1 != vec1.end() && it2 != vec2.end(); ++it1, ++it2)
    {
        std::cout << *it1 << ", " << *it2 << '\n';
    }
    

    Wobei ich für sowas einfaches bei vector auch den Index in Betracht ziehen würde:

    auto maxIndex = std::min(vec1.size(), vec2.size())-1;
    for (auto i = 0u; i < maxIndex; ++i)
    {  
      std::cout << vec1[i] << ", " << vec2[i] << '\n';
    }
    

    M10n schrieb:

    Cyres schrieb:

    Der Kommaoperator ist auch ungerne gesehen.

    hat der ausser unübersichtlichkeit sonst noch nachteile?

    Kommt drauf an, wo man ihn verwendet. Da er aber außer im Iterier-Statement der for-Schleife wohl so gut wie nie auch nur den geringsten Vorteil bringt, ist die Unübersichtlichkeit schon ausreichend, um ihn nicht zu verwenden 😉



  • Ich werf mal einen Verweis auf Boost.Iterators in die Runde, speziell boost::zip_iterator.



  • Warum nicht?

    #include <iostream>
    
    int main()
    {
    	bool condition = true;
    
    	int foo = condition ? ( std::cout << "yeah" , 42 ) : ( std::cout << "nope", 0 );
    }
    

Anmelden zum Antworten