24 Haziran 2018 Pazar

range-v3

Giriş
Şu satırı dahil ederiz.
#include <range/v3/all.hpp>
Kolay kullanım için şu satırı dahil ederiz.
using namespace ranges;
concat metodu
Şöyle yaparız.
const std::vector<std::string> v1{"A", "B", "C"}, v2{"D", "E", "F"};

for (const auto& s : ranges::view::concat(v1, v2)) {
  std::cout << s << std::endl;   
}
filter metodu
Elimizde struct içinde struct olsun.
struct Foo {};
struct FooBar{
  bool is_valid;
  Foo foo;
};
Şöyle yaparız.
std::vector<Foo> get_valid_foos(const std::vector<FooBar>& foobars) {
    return foobars
        | view::filter(&FooBar::is_valid)
        | view::transform(&FooBar::foo);
}
ints metodu
Örnek
Şöyle yaparız.
using namespace ranges;
int x = accumulate(view::ints(0) | view::take(10), 0); // 45
Örnek
Şöyle yaparız.
int x = accumulate(view::ints(0, 10), 0);
Örnek
Şöyle yaparız.
const std::vector<int> result = ranges::view::ints(23, 58); // upper bound is exclusive
iota metodu
Örnek
Elimizde iki yapı olsun.
std::vector<int> numbers;
...
std::vector<std::vector<int>::iterator> pointers;
Şöyle yaparız.
copy(view::iota(numbers.begin(), numbers.end()), back_inserter(pointers));
Örnek
Şöyle yaparız.
int N = 7;
std::vector<int> numbers = ranges::view::iota(0, N);

std::vector<std::vector<int>::iterator> pointers =
    ranges::view::iota(numbers.begin(), numbers.end());

std::cout << "indirectly printing out the numbers from 0 to " << N << '\n';
ranges::copy(ranges::view::indirect(pointers),
    ranges::ostream_iterator<>(std::cout, " "));
std::cout << '\n';
stride metodu  - Ayırarak dolaşmak
Şöyle yaparız.
std::vector<std::size_t> src {1, 2, 3, 4, 5, 6, 7};
const auto min_max = minmax (src | view::stride (3));
std::cout << min_max.first << " " << min_max.second << std::endl;
transform metodu
Elimizde bir struct olsun.
struct MyStruct {
  explicit MyStruct(std::string name) : name_(name){}
  std::string name() const { return name_; }
private:
  std::string name_;
};

std::vector<MyStruct> vm;
vm.emplace_back("asd");
vm.emplace_back("qwe");
vm.emplace_back("zxc");
Şöyle yaparız.
std::vector<std::string> vs = vm | ranges::view::transform (&MyStruct::name);