0%

More information on range-based for-loop

在Stackoverflow看到,怕忘記寫下來。

如何對std::map使用 for-ranged syntax

原文在此。
簡單的說就是用auto去接reference。

1
2
3
for (auto& kv : myMap) { 
std::cout << kv.first << " has value " << kv.second << std::endl;
}

如何反向訪問container

原文在此。
最簡單的方法是使用Boost

1
2
3
4
#include <boost/range/adaptor/reversed.hpp>

for (auto i : boost::adaptors::reverse(x))
std::cout << i << '\n';

如果沒有boost的話也可以土法煉鋼,原文Paul的方法不能使用,選用下面Jive的方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
template<class Fwd>
struct Reverser_generic {
Fwd &fwd;
Reverser_generic(Fwd& fwd_) : fwd(fwd_) {}
typedef std::reverse_iterator<typename Fwd::iterator> reverse_iterator;
reverse_iterator begin() { return reverse_iterator(std::end(fwd)); }
reverse_iterator end() { return reverse_iterator(std::begin(fwd)); }
};

template<class Fwd >
struct Reverser_special{
Fwd &fwd;
Reverser_special(Fwd& fwd_) : fwd(fwd_) {}
auto begin() -> decltype(fwd.rbegin()){ return fwd.rbegin(); }
auto end() ->decltype(fwd.rbegin()) { return fwd.rend(); }
};

template<class Fwd>
auto reverse_impl(Fwd& fwd, long) -> decltype(Reverser_generic<Fwd>(fwd)){
return Reverser_generic<Fwd>(fwd);
}

template<class Fwd>
auto reverse_impl(Fwd& fwd, int)
-> decltype(fwd.rbegin(), Reverser_special<Fwd>(fwd))
{
return Reverser_special<Fwd>(fwd);
}

template<class Fwd>
auto reverse(Fwd&& fwd) -> decltype(reverse_impl(fwd, int(0))) {
static_assert(!(is_rvalue_reference<Fwd&&>::value),
"Cannot pass rvalue_reference to dj::reverse()");
return reverse_impl(fwd, int(0));
}