24 Şubat 2020 Pazartesi

std::span Sınıfı

Giriş
Şu satırı dahil ederiz
#include <span>
Açıklaması şöyle. C++20 ile geliyor. Bu sınıf bir ara array_view ve array_ref olarak isimlendirildi.
The class template span describes an object that can refer to a contiguous sequence of objects with the first element of the sequence at position zero. A span can either have a static extent, in which case the number of elements in the sequence is known and encoded in the type, or a dynamic extent.
Kullanım
Eskiden şöyle yapardık
void read_into(int* buffer, int buffer_size);
Şimdi şöyle yapabileceğiz.
void read_into(span<int> buffer);

constructor
İmzaları şöyle
std::span<T> // non-const span of non-const elements
std::span<const T> // non-const span of     const elements
const std::span<T> //     const span of non-const elements
const std::span<const T> //     const span of     const elements
Örnek
Şöyle yaparız.
float* old = new float[6];
std::iota(old, old + 6, 0);
std::span<float> vpd(old, 6);
vpd[0] = 23;
std::cout << old[0] << std::endl;
delete[] old;
begin metodu
İmzası şöyle
constexpr iterator begin() const noexcept;
constexpr iterator end() const noexcept;
Örnek
Şöyle yaparız.  std::ranges altta begin() ve end() metodlarını kullanır.
#include <algorithm>
#include <cassert>
#include <span>

namespace ranges = std::ranges;

int main()
{
  int arr[] {1, 7, 3, 2, 0, 5, 0, 8};

  const std::span spn{arr};
  ranges::fill(spn, 173);               // this compiles

  assert(ranges::count(arr, 173) == 8); // passes
}
end metodu
Şöyle yaparız
#include <span>
#include <iostream>
#include <algorithm>

int main() {
  int data[] = { 5, 3, 2, 1, 4 };
  std::span<int> s{data, 5};

  std::sort(s.begin(), s.end());

  for (auto const i : s) {
    std::cout << i << "\n";
  }

  return 0;
}
operator[] metodu
Şöyle yaparız
void foo(std::span<int> const& s) {
  s[0] = 42;

  // now, consider what this does
  std::span<int> t = s;

  // and this
  t[0] = 42;
}

Hiç yorum yok:

Yorum Gönder