2016-09-09 2 views
2

У меня есть метод, который должен итерации map вперед или назад, в зависимости от состояния. себя операции независимы от направления, таким образом, я хотел бы быть в состоянии сделать что-то вроде этого:reverse_iterator и абстракция итератора в переменной

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 
} 

Я знаю, что я должен быть в состоянии сделать это с помощью функции шаблона (? справа), но это походит на бит переборки.

Есть ли способ, которым я мог бы сделать это в одной функции без шаблона? Может быть, с использованием <algorithm>?

+0

И внутри ' ', у вас есть шаблоны. – LogicStuff

+0

@LogicStuff Мне это известно, но мне не нужно писать их - просто лямбда, что я считаю более чистым (читабельность мудрым) в этом случае – slawekwin

+0

Вы можете увидеть [это] (http: //www.cplusplus .com/reference/map/map/begin /) и читаем пример, они используют итератор. –

ответ

2

Один из способов сделать это было бы первым фактором, что вы хотите сделать с каждым элементом, скажем

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

Тогда вы могли бы расшириться по направлению:

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

Я думаю, что это именно то, что я хотел, спасибо – slawekwin

Смежные вопросы