4 Kasım 2019 Pazartesi

std::accumulate metodu

Giriş
Bu algoritma aslında çok farklı amaçlar için kullanılabilir ancak ismi accumulate olduğu için sanki sadece toplama için kullanılabilir havası doğuyor.

std::accumulate metodu Paralel Yapılamaz
Açıklaması şöyle. Çünkü sırayla dolaşmak zorunda. Paralel işler için std::reduce kullanılmalı
Computes its result by initializing the accumulator acc with the initial value init and then modifies it with acc = std::move(acc) + *i or acc = binary_op(std::move(acc), *i) for every iterator i in the range [first, last) in order.

std::accumulate - first + last + init

Örnek - Toplama
Önce klasik kullanımına bakalım. Bu kullanımda varsayılan işlem operator + işlemidir. Bir aralığın toplamını bulmak için şöyle yaparız. 3. parametre olarak başlangıç değeri veriliyor.
double mean = std::accumulate(stl_v.begin(), stl_v.end(), 0.0) / stl_v.size();
Örnek - Toplama
Şöyle yaparız. Burada operator + kullanılıyor.
vector<string> v{"arg1", "arg2", "arg3", "arg4"};
size_t index = 2;
string merged = accumulate(v.begin() + index, v.end(), string(""));
cout << merged; //arg3arg4
Örnek - Toplama
Elimizde şöyle bir kod olsun.
std::vector<std::vector<int>>
İki boyutlu vector toplama için şöyle yaparız.
int sum = std::accumulate(
  vec.begin(), vec.end(),                       //iterators for the outer vector
  0,                                            //initial value for summation - 0
  [](int init, const std::vector<int>& intvec){ //binaryOp that sums a single vector<int>
    return std::accumulate(
      intvec.begin(), intvec.end(), // iterators for the inner vector
      init);                        // current sum
                                    // use the default binaryOp here
  }
);

std::accumulate - first + last + init + op

Örnek - Aralık İçindeki En Büyük Değer
Elimizde iki boyutlu bir veri olsun. En büyük değeri bulmak için şöyle yaparız. 3. parametre olarak ilk değer olan 5 verilir. 4. parametre olarak lambda kullanırız. Lambda bir boyutlu dizinin en büyük elemanı ile ilk parametreyi karşılaştırır ve büyüğünü döner. std::accumulate binary operator metounun son değerini verir.
#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
  std::vector<std::vector<double>> m{ {5, 0, 8}, {3, 1, 9} };

  double x = std::accumulate(m.begin(), m.end(), m[0][0],
                             [](double max, const std::vector<double> &v)
                             {
                               return std::max(max,
                                               *std::max_element(v.begin(),
                                                                 v.end()));
                             });

  std::cout << x << '\n';
  return 0;
}

Hiç yorum yok:

Yorum Gönder