2016-09-09 5 views
2

Ich habe eine Methode, die eine map vorwärts oder rückwärts iterieren soll, abhängig von einer Bedingung. Operationen selbst sind von der Richtung unabhängig, so würde ich so etwas können, gerne tun:reverse_iterator und Iterator Abstraktion in einer Variablen

std::map<int, int> some_map; 
auto iter = some_condition ? some_map.begin() : some_map.rbegin(); 
for (; iter != some_condition ? some_map.end() : some_map.rend(); ++iter) 
{ 
    //something to do with *iter 
} 

Ich weiß, soll ich in der Lage sein, dies mit Template-Funktion zu tun (? Rechts), aber es scheint wie ein ein bisschen Overkill.

Gibt es einen Weg, ich könnte es in einer Funktion tun, ohne Vorlage? Vielleicht mit der Verwendung von <algorithm>?

+0

Und innen ' ', Sie haben Vorlagen. – LogicStuff

+0

@LogicStuff Ich bin mir dessen bewusst, aber ich muss sie nicht schreiben - nur ein Lambda, das ich in diesem Fall als sauberer (Lesbarkeits) betrachten würde – slawekwin

+0

Sie können dies sehen (http: //www.cplusplus .com/reference/map/map/begin /) und lesen Sie das Beispiel, sie verwenden Iterator. –

Antwort

2

Eine Möglichkeit, dies zu tun wäre, um erste Faktor heraus, was Sie mit jedem Element tun wollen, sagen

auto f = [](const std::pair<int, int> &p) { std::cout << p.first << std::endl; }; 

Dann sind Sie auf die Richtung verzweigen könnte:

if(forward) 
    std::for_each(std::begin(m), std::end(m), f); 
else 
    std::for_each(std::rbegin(m), std::rend(m), f); 
+0

Ich denke, das ist genau das, was ich wollte, danke – slawekwin

Verwandte Themen