9 Temmuz 2020 Perşembe

std::valarray - Kullanmayın

Giriş
Şu satırı dahil ederiz.
#include <valarray>
Bu Veri Yapısı STL Kökenli Değildir
Bu veri yapısı STL kökenli değildir. Muhtemelen Fortran'dan esinlenmiştir. std::vector ile köken farkının açıklaması şöyle
Because they don't come from the same place: vector comes from the STL library, and valarray doesn't (I haven't been able to find out where it comes from, but there seem to be strong connections to Fortran).
Bu yüzden farklı constructor'lara sahiptirler. std::vector nesnesini n tane X değeri ile doldurmak için şöyle yaparız
std::vector<double> v(n, X);
std::valarray nesnesini n tane X değeri ile doldurmak için şöyle yaparız
std::valarray<double> va(X, n);
Neden Lazım?
Bazı işlemleri daha optimize yapabilirler. Açıklaması şöyle.
std::valarray and helper classes are defined to be free of certain forms of aliasing, thus allowing operations on these classes to be optimized similar to the effect of the keyword restrict in the C programming language. In addition, functions and operators that take valarray arguments are allowed to return proxy objects to make it possible for the compiler to optimize an expression such as v1 = a * v2 + v3; as a single loop that executes v1[i] = a * v2[i] + v3[i]; avoiding any temporaries or multiple passes.
Constructor
Şöyle yaparız. Burada constructor parametrelerini std::vector ile ters olduğuna dikkat etmek lazım.
const int N = 100000000;
std::valarray<float> a(1, N);
operator [] metodu
Şöyle yaparız.
const int N = 100000000;
std::valarray<float> a(1, N);
std::valarray<float> c(2, N);
std::valarray<float> b(3, N);
std::valarray<float> d(N);


for (int i = 0; i < N; i++)
  d[i] = a[i] + b[i] * c[i];
operator + metodu
İmzası şöyle. İki std::valarray nesnesini toplar
template<class _Ty> inline
valarray<_Ty> operator+(const valarray<_Ty>& _Left,
                        const valarray<_Ty>& _Right);
operator - metodu
İki std::valarray nesnesini çıkarır.

Örnek
Şöyle yaparız.
std::valarray<int> a{ 1, 2 }, b{ 2, 4 }, c;
c = a - b; // c is {-1,-2}
a += b; // a is {3,6}
a -= b; // a is {1,2} again
a += {2, 4}; // a is {3,6} again
operator * metodu
Örnek
Şu kod derlenmez.
valarray<int> v { 1, 2, 3 };

for (auto x : v) { (void)x; } // Ok

auto w = v * 2;     // Leads to failure in range based loop below
Şöyle yaparız.
std::valarray<int> w = v * 2;
Örnek
Şöyle yaparız.
const int N = 100000000;
std::valarray<float> a(1, N);
std::valarray<float> c(2, N);
std::valarray<float> b(3, N);
std::valarray<float> d(N);

d = a + b * c;
operator / metodu
std::valarray nesnesini bir değer ile böler.

Örnek
Şöyle kullanırız.
#include <iostream>
#include <valarray>
using namespace std;

int main() {
  valarray<double> arr({5,10,15,20,25});
  auto v = arr[0];
  arr=arr/v;

  for(int value:arr)cout << value << ' ';
  return 0;
}
Çıktı olarak şunu alırız.
1 2 3 4 5
size metodu
Şöyle yaparız.
void check(std::valarray<float>& a)
{
  for (int i = 0; i < a.size(); i++)
    if (a[i] != 7)
      std::cout << "Error" << std::endl;
}

Hiç yorum yok:

Yorum Gönder