Блог пользователя Kemal

Автор Kemal, история, 10 лет назад, По-английски

Hey there!

I think everyone know what does this piece of code do:

vector <int> v = {1, 2, 3, 4};
for (int x : v)
  cout << x << " ";

prints: 1 2 3 4

Is there any way to do this in reverse order ?!

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
10 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
template<class T>
struct reversed_iter {
  T & container;
  
  reversed_iter(T & container): container(container) {}
  
  auto begin() -> decltype(container.rbegin()) {
    return container.rbegin();
  }
  
  auto end() -> decltype(container.rend()) {
    return container.rend();
  }
};

template<class T>
reversed_iter<T> make_reversed(T & container) {
  return reversed_iter<T>(container); 
}

int main() {  
  vector <int> v = {1, 2, 3, 4};
  for (auto x : make_reversed(v))
    cout << x << " ";
    
  // or just
  for (auto x = v.rbegin(); x != v.rend(); ++x)
    cout << *x << " ";
}
»
10 лет назад, скрыть # |
 
Проголосовать: нравится +29 Проголосовать: не нравится

Such simple!

Array [1 2 3 4] will be printed in reverse order.

vector <int> v = {4, 3, 2, 1};
for (int x : v)
  cout << x << " ";
»
10 лет назад, скрыть # |
 
Проголосовать: нравится +15 Проголосовать: не нравится

There was a post: http://mirror.codeforces.com/blog/entry/10124 where using templates you can write in C++ like this:

for (auto i: range(1000))
    sum += i;
or
for (auto i: range(10, 20))
    cout << i << endl;
»
10 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится -10 Проголосовать: не нравится

You can use reverse function for vector. vector <int> v = {1, 2, 3, 4}; reverse(v.begin(), v.end()); for(int i : v) { cout << i << " "; }
»
3 года назад, скрыть # |
 
Проголосовать: нравится +15 Проголосовать: не нравится

Using C++20:

#include <ranges>

vector v = {1, 2, 3, 4};
for (int x: v | views::reverse) 
  cout << x << ' ';

// or
for (int x: views::iota(1, 5) | views::reverse) 
  cout << x << ' ';
  • »
    »
    3 года назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Any effect on time complete?

    • »
      »
      »
      3 года назад, скрыть # ^ |
       
      Проголосовать: нравится +3 Проголосовать: не нравится

      I did a few experiments running a loop for $$$10^9$$$ iterations, looks like performance depends on compiler optimizations. If no optimizations used at all, then ranges perform quite slow, however if you turn on some optimizations, then the difference with regular loop becomes really insignificant.

      No optimizations (-O0):

      for loop regular: 2023ms
      for loop views::iota: 6070ms
      for loop views::iota | views::reverse: 18875ms
      

      Using -O2 optimizations:

      for loop regular: 449ms
      for loop views::iota: 451ms
      for loop views::iota | views::reverse: 468ms
      

      Using -O3 optimizations:

      for loop regular: 247ms
      for loop views::iota: 246ms
      for loop views::iota | views::reverse: 299ms