range etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
range etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

4 Nisan 2018 Çarşamba

range adaptors filtered Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/range/adaptor/filtered.hpp>
Nasıl Çalışır
filtered metodu filtered_range nesnesi döner. Bu nesnenin "operator |" metodu vardır. Bu metod filtered_range döner.

Metodun için şöyle
template< class SinglePassRange, class Predicate >
inline filtered_range<Predicate, SinglePassRange>
operator|(SinglePassRange& r,
          const filter_holder<Predicate>& f)
{
    BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<SinglePassRange>));
    return filtered_range<Predicate, SinglePassRange>( f.val, r );
}

Constructor - lamda
Şöyle yaparız.
vector<int> vec = {0,1,2,3,4,5,6,7,8,9,10};
auto r = vec | boost::adaptors::filtered([](auto&& v) { return v % 2; });
for (auto i: r)
    std::cout << i << '\n';
}
Constructor - predicate
Aslında predicate yine lambda olarak tanımlı :)
Örnek
Şöyle yaparız.
char const* input = "AABAAB";

unsigned counter{};
auto pred = [&counter](auto const&){ return ++counter % 3; };
boost::copy(
  boost::make_iterator_range (input, input+strlen(input)) |
  boost::adaptors::filtered  (pred),
  std::ostream_iterator<char>(cout)
);
Örnek
Şöyle yaparız.
std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;

boost::copy(input | filtered(is_even()),
            std::ostream_iterator<int>(std::cout, ","));

3 Nisan 2018 Salı

range utilities iterator_range Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/range/iterator_range.hpp>
İki iterator aralığını range olarak temsil eder. range algoritmaları yanında yardımcı bir sınıftır. Açıklaması şöyle
iterator_range is bridge between ranges and iterators. For instance - you have pair of iterators, and you want pass them to algorithm which only accepts ranges. In that case you can wrap your iterators into range, using iterator_range. Or better - make_iterator_range - it will help to deduce types (like std::make_pair does):
Constructor
Örnek
Şöyle yaparız.
const char* s = ...;
boost::iterator_range<std::string::const_iterator> range {s, s + 10};
Örnek - make_iterator_range
Şu yöntemi kullanır.
make_iterator_range(iterator1,iterator2)
Şöyle yaparız.
Array arr={11,22,33,44,55,66,77,88};
boost::for_each( make_iterator_range(arr,arr+5) ,print());
empty metodu
Şöyle yaparız
std::vector<int> is { 1,2,3 };
auto range = boost::make_iterator_range(is.begin(), is.end());
std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";

range = boost::make_iterator_range(is.end(), is.end());
std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";

is.clear();

range = {};
std::cout << "range empty? " << std::boolalpha << range.empty() << "\n";
Çıktı olarak şunu alırız.
range empty? false
range empty? true
range empty? true