我在这里找到了很多关于该主题的答案,但我无法让我的代码运行。
编辑: 发布的示例现在可以在引入缺失的内容后工作。希望有人可以将这个例子作为自己实验的基础。我还介绍了将这个示例用作随机访问迭代器的缺失内容。它与 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;
}