fork(2) download
  1. #include <iostream>
  2. #include <map>
  3. #include <boost/iterator/transform_iterator.hpp>
  4. using namespace std;
  5.  
  6.  
  7. template<typename T, typename F>
  8. struct map_adaptor
  9. {
  10. map_adaptor(const T& t, const F& f) : _t(t), _f(f)
  11. {
  12.  
  13. }
  14. map_adaptor(map_adaptor& a) = delete;
  15. map_adaptor(map_adaptor &&a) = default;
  16.  
  17. auto begin()
  18. {
  19. return boost::make_transform_iterator(_t.begin(), _f);
  20. }
  21.  
  22. auto end()
  23. {
  24. return boost::make_transform_iterator(_t.end(), _f);
  25. }
  26.  
  27. protected:
  28. const T& _t;
  29. F _f;
  30. };
  31.  
  32.  
  33. template<typename T, typename F>
  34. auto get_map_adaptor(const T& t, const F& f)
  35. {
  36. return map_adaptor<T, F>(t, f);
  37. }
  38.  
  39.  
  40. template<typename T>
  41. auto get_keys(const T& t)
  42. {
  43. return get_map_adaptor(t, [](auto& p) { return p.first; });
  44. }
  45.  
  46. template<typename T>
  47. auto get_values(const T& t)
  48. {
  49. return get_map_adaptor(t, [](auto& p) { return p.second; });
  50. }
  51.  
  52. int main() {
  53. // your code goes here
  54. map<string, int> m = { {"Foobar",1},{ "Foobar2",2 },{ "Foobar3",3 } };
  55.  
  56. for (auto&& i : get_keys(m))
  57. cout << i << endl;
  58.  
  59. for (auto&& i : get_values(m))
  60. cout << i << endl;
  61.  
  62. return 0;
  63. }
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
Foobar
Foobar2
Foobar3
1
2
3