[C/C++]_[初級][OutputIteratorについての簡単な紹介]


シーン
1.アルゴリズムライブラリを使用する場合、集合を並べ替えたり、コピーしたり、移動したりする必要があるが、集合の要素を操作するには列挙(itereator)が必要である.
2.既存のコレクションを巡回、削除するのが一般的ですが、コレクションA内の要素をコレクションB内にコピーする必要がある場合は、列挙はどのように使用しますか?使用効率の低いforサイクルを必要とすることなく、列挙により多元素添加を容易に行うことができる.
説明
1.Iteratorは、集合の要素を識別して往復移動することができるタイプとしてもよいし、抽象的なポインタとしても理解できる.それは5種類の列挙を含む:InputIterator, OutputIterator, ForwardIterator, BidirectionalIterator, RandomAccessIterator;C++17である場合には、さらにタイプContiguousIteratorを含む.
2.OutputIteratorは、指向する要素を書き込むことができる列挙である.ForwardIterator, BidirectionalIterator, RandomAccessIteratorはいずれもOutputIteratorの一種である.OutputIteratorは、私たちが最もよく使ういくつかの操作を満たしています.
3.std::back_Inserterはコンテナpushを介して迅速に作成できます.back関数に要素を追加する列挙は、もちろんコンテナにpush_があります.back関数
4.std::inserterはコンテナのinsert関数によって要素を追加する列挙を迅速に作成することができ、もちろんコンテナにはinsert関数があり、コンパイルエラーはありません.
*r = o //       , r        ,   r  1,          .
++r
r++
*r++ = o

#include 
#include 
#include 
#include 
#include 
#include 

template <class A>
static void PrintArray(A& a)
{
  std::cout << typeid(a).name() << std::endl;
  if(a.begin() == a.end())
    return;

  auto ite = a.begin();
  std::cout << "(";
  std::cout << *ite;
  ite++;
  for(; ite != a.end();++ite){
    std::cout << "," << *ite;
  }
  std::cout << ")" << std::endl;
}

void TestIterator()
{
  std::vector<int> v;
  // back_insert_iterator    , operator=       ,    back  ,       
  // container push_back  .
  auto& itev = std::back_inserter(v);
  itev = 1;
  itev = 2;
  itev = 3;
  itev = 4;
  itev = 5;
  itev = 5;
  PrintArray(v);

  std::vector<int> f;
  f.push_back(-1);
  f.push_back(-2);
  f.push_back(-3);
  PrintArray(f);

  //    v     f,  f  2     .
  std::copy(v.begin(),v.end(),std::inserter(f,std::next(f.begin())));
  PrintArray(f);

  //   vector set,       .
  // std::inserter          insert  .
  std::set<int> s;
  std::copy(v.begin(), v.end(),std::inserter(s,s.begin())); 
  PrintArray(s);

  std::vector<int> result;
  std::sort(v.begin(),v.end());
  std::sort(f.begin(),f.end());

  //          
  //        result.begin()     , 
  // vector iterator not incrementable;
  //    result.begin()  OutputIterator, iterator     ,result      .
  //std::set_difference(f.begin(),f.end(),v.begin(),v.end(),result.begin());
  std::set_difference(f.begin(),f.end(),v.begin(),v.end(),std::back_inserter(result));
  PrintArray(result);
}

出力:
class std::vector<int,class std::allocator<int> >
(1,2,3,4,5,5)
class std::vector<int,class std::allocator<int> >
(-1,-2,-3)
class std::vector<int,class std::allocator<int> >
(-1,1,2,3,4,5,5,-2,-3)
class std::set<int,struct std::less<int>,class std::allocator<int> >
(1,2,3,4,5)
class std::vector<int,class std::allocator<int> >
(-3,-2,-1)

リファレンス
OutputIterator concept-Iterator iterator back_inserter insert_iterator inserter next copy