これは簡単な演習です。C スタイルの文字配列用のカスタム イテレータをすべて自分で書きたいと思います。ブーストはありません。中途半端だと思うのですが、使用するとエラーが出てしまいますstd::count
。
私のイテレータはこれです:
class myIterator : std::iterator<std::input_iterator_tag, char>
{
char *p;
public:
// Definitions
typedef typename std::iterator<std::input_iterator_tag, char>::difference_type difference_type;
typedef typename std::iterator<std::input_iterator_tag, char>::value_type value_type;
typedef typename std::iterator<std::input_iterator_tag, char>::reference reference;
typedef typename std::iterator<std::input_iterator_tag, char>::pointer pointer;
// Implementation
myIterator(char* x) :p(x) { };
myIterator(const myIterator& i) : p(i.p) { };
myIterator& operator++() { ++p; return *this; };
myIterator operator++(int) {myIterator tmp(*this); operator++(); return tmp; };
bool operator==(const myIterator& rhs) { return p == rhs.p; };
bool operator!=(const myIterator& rhs) { return p != rhs.p; };
char& operator*() { return *p; };
};
したがって、for
ループでイテレータを使用すると、それは素晴らしいことです。
for (auto it = data.begin(); it != data.end(); it++)
std::cout << *it;
ただし、これはコンパイル時エラーになります。
std::cout << std::count(data.begin(), data.end(), '@') << std::endl;
価値があるのは、 anddata
の古典的なラッピング関数(つまり、and ) を備えた非常に単純なクラスです。begin()
end()
return myIterator(address_);
return myIterator(address_ + size_);
私には不可解なエラーは何ですか:
error: no matching function for call to 'count'
[...]
note: candidate template ignored: substitution failure [with _InputIterator = myIterator, _Tp = char]: no type named 'difference_type' in 'std::__1::iterator_traits<myIterator>'
count(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
difference_type
ここに何かが欠けています:イテレータで宣言しました。
誰でも助けることができますか?