fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. template <typename Range>
  5. class counted_view {
  6. Range r;
  7.  
  8. typedef counted_view self;
  9.  
  10. typedef decltype(std::begin(r)) nested_iterator;
  11. typedef decltype(*std::begin(r)) nested_value_type;
  12. public:
  13.  
  14. counted_view(Range& r) : r(r) {}
  15.  
  16. class iterator
  17. {
  18. public:
  19. iterator(nested_iterator iter) : iter(iter), counter(0) {}
  20.  
  21. std::pair<std::size_t, nested_value_type> operator*()
  22. {
  23. return std::pair<std::size_t, nested_value_type>(counter, *iter);
  24. }
  25.  
  26. iterator& operator++()
  27. {
  28. ++iter;
  29. ++counter;
  30.  
  31. return *this;
  32. }
  33.  
  34. bool operator!=(iterator& other)
  35. {
  36. return iter != other.iter;
  37. }
  38.  
  39. private:
  40. nested_iterator iter;
  41. std::size_t counter;
  42. };
  43.  
  44. iterator begin()
  45. {
  46.  
  47. return iterator(std::begin(r));
  48. }
  49.  
  50. iterator end()
  51. {
  52. return iterator(std::end(r));
  53. }
  54. };
  55.  
  56. template <typename Range>
  57. counted_view<Range> counted(Range& r) {
  58. return counted_view<Range>(r);
  59. }
  60.  
  61. int main(int argc, const char * argv[])
  62. {
  63. std::vector<double> vec = {10,20,30,40,50,60,70,80,90};
  64. for(auto p : counted(vec))
  65. {
  66. std::cout << p.first << ": " << p.second << std::endl;
  67. }
  68.  
  69. // insert code here...
  70. std::cout << "Hello, World!\n";
  71. return 0;
  72. }
  73.  
  74.  
Success #stdin #stdout 0s 3028KB
stdin
Standard input is empty
stdout
0: 10
1: 20
2: 30
3: 40
4: 50
5: 60
6: 70
7: 80
8: 90
Hello, World!