31 Ocak 2017 Salı

OutputIterator

Giriş
5 tane iterator kategorisi var. Bunlar
1. input_iterator_tag - InputIterator yazısına bakınız.
2. output_iterator_tag - Bu yazı.
3. forward_iterator_tag - ForwardIterator yazısına bakınız.
4. bidirectional_iterator_tag,
5. random_access_iterator_tag - RandomAccessIterator yazısına bakınız

forward_iterator_tag,bidirectional_iterator_tag ve random_access_iterator_tag yapıları aynı zamanda output_iterator_tag'den kalıtır.

Açıklaması şöyle
Assignment through the same value of an output iterator happens only once: algorithms on output iterators must be single-pass algorithms.

STL içindeki InputIterator ve OutputIterator kullanan algoritmalar şunlar.

Nasıl Tanımlanır
Sınıf şöyle tanımlanır
class infix_ostream_iterator :
    public std::iterator<std::output_iterator_tag,void,void,void,void>
{...}
operator copy assignment  metodu
Bu metod tanımlı değilse VS 2012'den itibaren hata alırız.

operator = metodu
Output Iterator sınıfının en önemli metodu = operatörüdür. Burada yapılması gereken iş yapılır.
infix_ostream_iterator<T,charT,traits>& operator=(T const &item)
{
   ...
   return *this;
}
operator * metodu
Şöyle yaparız. Bu metodu genelde doldurmaya gerek olmaz.
infix_ostream_iterator<T,charT,traits> &operator*() {
        return *this;
}
operator ++ metodu
Şöyle yaparız. Bu metodu doldurmak gerekir.
infix_ostream_iterator<T,charT,traits> &operator++() {
        return *this;
}
operator ++ metodu
Şöyle yaparız. Bu metodu genelde doldurmaya gerek olmaz.
infix_ostream_iterator<T,charT,traits> &operator++() {
  return *this;
}
Yazma İşlemi
"Output iterators can only step forward with write access. Writing data without checking for end of sequence is correct. In fact, you can't operate an output iterator with an end iterator because output iterators do not have to provide a comparison operation."
Aşağıdaki kod parçası end() kullanmadığı için doğrudur.

while (true) {
 *pos = foo ();
 ++pos;
}

Bu kod parçası ise end() kullandığı için output iterator açısından imkansızdır.

while (pos != end()) {
 *pos = foo ();
 ++pos;
}




Hiç yorum yok:

Yorum Gönder