17 Haziran 2020 Çarşamba

std::iota - Belirtilen iterator Aralığını Doldurur

Giriş
Bu metodu kullanmak için şu satır dahil edilir.
#include <numeric>
iota Yunan alfabesindeki bir harften gelir. Matematikte bir sayı kümesini belirtmek için kullanılır.

C++11 ile gelen bu metod verilen aralığı belirtilen sayıdan başlamak üzere doldurur.

Örnek - Container capacity kadar sayı yerleştirilir
Şöyle yaparız. Listeye 0-100 arası sayılar yerleştirilir.
vector<int> v(101);
std::iota(v.begin(), v.end(), 0);
Örnek - Container capacity kadar sayı yerleştirilir
Şöyle yaparız. 0+1+2+ 3+4 toplamını yani 10 verir.
constexpr int triangle_number(int n)
{
  std::vector<int> intermediate(n);
  std::iota(intermediate.begin(), intermediate.end(), 0);
  return std::accumulate(intermediate.begin(), intermediate.end(), 0);
}

std::array<int, triangle_number(5)> arr;
iota ve bir basamak artırım
ioata ++ operatörü ile verilen değeri sadece 1 basamak artırır. Eğer n basamak artırmak istersek daha basit bir şekilde şöyle yaparız.
int n = -2;
std::generate(x.begin(), x.end(), [&n]{ return n+=2; }); 
int n = 10;
std::generate(x.begin(), x.end(), [&n]{ return n--;})
kendi iota functor'ımız
Şöyle yaparız. operator++ ve operator type metodlarını sağlarız.
template<class T>
struct IotaWrapper
{
  typedef T type;
  typedef std::function<type(const type&)> IncrFunction;

  type value;
  IncrFunction incrFunction;

  IotaWrapper() = delete;
  IotaWrapper(const type& n, const IncrFunction& incrFunction) :
  value(n), incrFunction(incrFunction) {};

  operator type() { return value; }
  IotaWrapper& operator++() {value = incrFunction(value); return *this; }
};

int main()
{
  IotaWrapper<int> n(0, [](const int& n){ return n+2; });
  std::vector<int> v(10);
  std::iota(v.begin(), v.end(), n);

  for (auto i : v)
    std::cout << i << ' ';
  std::cout << std::endl;
}
Çıktı olarak şunu alırız.
0 2 4 6 8 10 12 14 16 18



Hiç yorum yok:

Yorum Gönder