私は図書館を通り抜けていてboost::range
、気づきboost::range_iterator
ましたboost::iterator_range
。私はここでこれらの用語と混同しています。誰かが2つの違いは何ですか、そしていつ何を使うべきか説明してもらえますか?また、ドキュメントとは別に、ブースト範囲ライブラリを使用してそれについて詳しく知るためのサンプル例を教えていただければ幸いです。
2 に答える
誰かが2つの違いは何ですか、そしていつ何を使うべきか説明してもらえますか?
range_iteratorは、次の方法で範囲イテレータのタイプを取得するために使用されます。
range_iterator< SomeRange >::type
std::iterator_traitsと似ています。たとえば、イテレータから値型を取得できます。
std::iterator_traits<int*>::value_type
iterator_rangeは、範囲とイテレータの間のブリッジです。たとえば、イテレータのペアがあり、範囲のみを受け入れるアルゴリズムにそれらを渡したいとします。その場合、iterator_rangeを使用して、イテレータを範囲にラップできます。またはより良い-make_iterator_range-タイプを推測するのに役立ちます(std :: make_pairのように):
make_iterator_range(iterator1,iterator2)
範囲を返します。
次の例を検討してください。
#include <boost/range/iterator_range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/iterator.hpp>
#include <typeinfo>
#include <iostream>
#include <ostream>
using namespace boost;
using namespace std;
struct print
{
template<typename T>
void operator()(const T &t) const
{
cout << t << " ";
}
};
int main()
{
typedef int Array[20];
cout << typeid( range_iterator<Array>::type ).name() << endl;
Array arr={11,22,33,44,55,66,77,88};
boost::for_each( make_iterator_range(arr,arr+5) ,print());
}
また、ドキュメントとは別に、ブースト範囲ライブラリを使用してそれについて詳しく知るためのサンプル例を教えていただければ幸いです。
簡単な要約については、このスライドを確認してください
通常、直接使用することはありません。boost::range_iterator
これは、指定された範囲を取得し(範囲のタイプに関係なく)、begin()/ end()メソッドのタイプを返すテンプレートメタ関数であるためです。
boost::iterator_range
は、既存のイテレータのペアから新しい範囲を作成するために使用されます。これは、通常、まだイテレータベースのコードを取得し、それを使用して範囲に変換するときに使用する可能性が高くなります。