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ı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
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 - ToplamaElimizde şö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