2009-12-01 5 views
11

Was ist die beste Methode, um alle Elementpaare im Standardcontainer wie std::list, std::set, std::vector usw. zu durchlaufen?Iterieren über alle Elementpaare in Std-Containern (C++)

Im Grunde das Äquivalent, dies zu tun, sondern mit Iteratoren:

for (int i = 0; i < A.size()-1; i++) 
    for(int j = i+1; j < A.size(); j++) 
     cout << A[i] << A[j] << endl; 

Antwort

11

Der einfachste Weg ist Umschreiben nur den Code wörtlich:

for (auto i = foo.begin(); i != foo.end(); ++i) { 
    for (auto j = i; ++j != foo.end(); /**/) { 
    std::cout << *i << *j << std::endl; 
    } 
} 

ersetzen auto mit einem const_iterator für C++ 98/03. Oder setzen Sie es in seine eigene Funktion:

template<typename It> 
void for_each_pair(It begin, It end) { 
    for (It i = begin; i != end; ++i) { 
    for (It j = i; ++j != end; /**/) { 
     std::cout << *i << *j << std::endl; 
    } 
    } 
} 
+0

'auto' ist kein Teil des aktuellen Standards. –

+0

Wahr, Faulheit hier. Kommentar hinzugefügt. – MSalters

+0

Ordentlich! Du bist bereits im 1x-Modus! – xtofl

1

Just, const_iterators Gebrauch zu durchqueren. Wenn Sie Werte ändern möchten, verwenden Sie Iterator.

Beispiel:

typedef std::vector<int> IntVec; 

IntVec vec; 

// ... 

IntVec::const_iterator iter_cur = vec.begin(); 
IntVec::const_iterator iter_end = vec.end(); 
while (iter_cur != iter_end) { 
    int val = *iter_cur; 
    // Do stuff with val here 
    iter_cur++; 
}