ここでトピックに対する多くの回答を見つけましたが、コードを実行できませんでした。
編集: 投稿された例は、不足しているものを導入した後に機能するようになりました。この例を自分の実験の基礎として使用できることを願っています。また、この例をランダム アクセス イテレータとして使用するために不足しているものも紹介しました。binary_search アルゴリズムを使用すると、はるかに効率的に機能します。
独自のイテレータを作成する必要がある場合、value_type やその他の「スペシャル」を操作するのに苦労します。
ここでイテレータを書かない方法について多くの記事を読みましたが、実際の例を得ることができませんでした。特に、イテレータから派生してはならないことを読みました。だから私は愚かにもう一度尋ねます:
イテレータの value_type を定義するにはどうすればよいですか。クラス定義では機能せず、type_traits 構造体を手動で定義しても機能しませんでした。続行方法がわかりません...
#include <iostream>
#include <algorithm>
#include <type_traits>
#include <iterator>
using namespace std;
int data[]= { 1,4,7,9,11,20,28 }; //Sorted data
template < typename T >
class MyIter
{
int offset;
T* base;
public:
typedef int value_type;
//add the following lines after reading the answers -> it works!
typedef std::ptrdiff_t difference_type;
typedef T * pointer;
typedef T & reference;
typedef std::forward_iterator_tag iterator_category;
// if you want to use as random access iterator:
// typedef std::random_access_iterator_tag iterator_category;
public:
MyIter( T* _base, int _offset) : base(_base), offset(_offset) {}
MyIter() {}
bool operator !=( const MyIter& rhs)
{
T* tmp1= base+offset;
T* tmp2= rhs.base + rhs.offset;
return tmp1 != tmp2;
}
MyIter operator++(int)
{
MyIter tmp(*this);
offset++;
return tmp;
}
T operator*()
{
return *(base+offset);
}
// Addition: if used as random access iterator you must provide:
int operator-(const MyIter& rhs)
{
return offset-rhs.offset;
}
MyIter operator+=(int off)
{
offset+=off;
return *this;
}
};
typedef MyIter<int> iterType ;
int main()
{
cout << "ok" << endl;
pair<iterType, iterType> bounds;
MyIter<int> start( data,0);
MyIter<int> ende ( data,7);
bounds = equal_range( start, ende, 28 );
for ( iterType it= bounds.first; it!=bounds.second; it++)
{
cout << "Found " << *it << endl;
}
return 0;
}