在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)); }
|