Информация об изменениях

Сообщение Re[7]: range based for - первый/последний? от 13.03.2019 18:27

Изменено 13.03.2019 18:30 rg45

Re[7]: range based for - первый/последний?
Здравствуйте, Marty, Вы писали:


R>>Также он не подходит для lvalue-последовательностей, где один и тот же елемент может встретиться более одного раза.


M>Можно пример такого?


Пожалуйста. В этом примере ты проходишь по последовательности из десяти елементов и получаещь, что каждый элемент является и первым, и последним одновременно.

Только не придирайся, пожалуйта, к использованияю boost::adaptors::indirected — он использован исключительно ради упрощения примера. Использование адаптеров контейнеров давно уже не является прерогативой буста и пишется такой адаттор за считанные минуты в несколько строк.

https://ideone.com/YqTMaO

#include <iostream>
#include <vector>
#include <boost/range/adaptor/indirected.hpp>

int main()
{
   std::cout << std::boolalpha;

   int t = 42;
   std::vector<const int*> v(10, &t);

   const auto cont = v | boost::adaptors::indirected;
    
   for (auto& a : cont)
   {
      auto first = &a == &cont.front();
      auto last = &a == &cont.back();

      std::cout << first << ", " << last << std::endl;
   }

}
Re[7]: range based for - первый/последний?
Здравствуйте, Marty, Вы писали:


R>>Также он не подходит для lvalue-последовательностей, где один и тот же елемент может встретиться более одного раза.


M>Можно пример такого?


Пожалуйста. В этом примере ты проходишь по последовательности из десяти элементов и получаещь, что каждый элемент является и первым, и последним одновременно.

Только не придирайся, пожалуйта, к использованияю boost::adaptors::indirected — он использован исключительно ради упрощения примера. Использование адаптеров контейнеров давно уже не является прерогативой буста и пишется такой адаттор за считанные минуты в несколько строк.

https://ideone.com/YqTMaO

#include <iostream>
#include <vector>
#include <boost/range/adaptor/indirected.hpp>

int main()
{
   std::cout << std::boolalpha;

   int t = 42;
   std::vector<const int*> v(10, &t);

   const auto cont = v | boost::adaptors::indirected;
    
   for (auto& a : cont)
   {
      auto first = &a == &cont.front();
      auto last = &a == &cont.back();

      std::cout << first << ", " << last << std::endl;
   }

}