연습으로 std::sort
에서 사용할 사용자 지정 반복기를 작성하려고합니다. 그 문서에서, 나는 읽기 :최소한의 사용자 지정 연산자를 작성하십시오. std :: sort를 사용하려면 내 유형에 대해 디그가되어야합니다.
[My iterator] must meet the requirements of ValueSwappable and
RandomAccessIterator .
완전히 그 1를 구현하지 않고, 나는이 MCVE에 왔어요 :
#include <iostream>
#include <algorithm>
struct mcve_random_access_iterator
{
using size_type = std::size_t;
using value_type = int;
size_type _index;
value_type* _values;
mcve_random_access_iterator(value_type* values) : _index(0), _values(values) {}
mcve_random_access_iterator& operator-(const mcve_random_access_iterator& rhs) { _index-=rhs._index ; return *this; }
value_type& operator*() { return _values[_index]; }
friend bool operator==(mcve_random_access_iterator& lhs, mcve_random_access_iterator& rhs) { return lhs._index == rhs._index; }
friend bool operator!=(mcve_random_access_iterator& lhs, mcve_random_access_iterator& rhs) { return !(lhs == rhs); }
};
void swap(mcve_random_access_iterator& lhs, mcve_random_access_iterator& rhs)
{
std::swap(*lhs, *rhs);
}
struct mcve_container
{
int _values[3];
mcve_container() : _values{2, 3, 1} {}
mcve_random_access_iterator begin() { return {_values}; }
mcve_random_access_iterator end() { auto b = begin(); b._index = sizeof(_values)/sizeof(_values[0]); return b; }
};
int main()
{
mcve_container data;
std::sort(data.begin(), data.end());
for (auto n : data._values)
std::cout << n << ", ";
std::cout << "\n";
}
는 g ++ 7.2.0로 컴파일, 나는 다음과 같은 오류가 발생합니다 :
/usr/local/include/c++/7.2.0/bits/stl_algo.h:1969:14: error: no matching function for call to '__lg(mcve_random_access_iterator&)' std::__lg(__last - __first) * 2,
왜이 오류가 발생하며 어떻게 해결할 수 있습니까?
1) 나는 여전히 오류를 재현 mcve_random_access_iterator
에서 RandomAccessIterator의 모든 요구 사항을 제거했습니다.
예제를 줄이는 데 좋은 직장입니다. 실제 문제의 방식을 더 빨리 실현했습니다. – milleniumbug
*'value_type','difference_type','reference','pointer', iterator_category'를 모두 제공하지 않으면 * 직접적으로 또는'std의 전문화를 제공함으로써 * 어떤 종류의 * Iterator가 아닙니다 :: iterator_traits') – Caleth