自定义random_access_iterator传入std::any_of编译失败问题咨询
问题根本原因
你声明迭代器类别为std::random_access_iterator_tag,但没有实现随机访问迭代器要求的全部运算符,STL算法的优化路径触发了未实现的运算符调用,直接导致编译失败。
具体细节
- C++标准对不同类别的迭代器有明确的运算符要求:随机访问迭代器必须支持两个迭代器相减求距离(
operator-)、偏移加减、下标访问、大小比较等操作,而你当前的Iterator只实现了输入迭代器要求的解引用、前后自增、相等/不等判断操作。 - STL的
std::any_of会根据迭代器类别选择不同的实现分支:检测到迭代器是随机访问类别时,会进入优化实现,先通过__last - __first计算迭代器区间长度做循环展开等优化,你的代码没有实现operator-,就触发了错误信息里的运算符不匹配报错。 - 当你把迭代器类别改成
std::input_iterator_tag时,std::any_of会走适配输入迭代器的通用实现,只会通过逐次++遍历迭代器,刚好匹配你当前实现的所有运算符,所以编译正常。
修复方案
两种方案二选一即可:
- 如果不需要随机访问能力,直接保持
iterator_category为std::input_iterator_tag即可,无需修改其他代码。 - 如果确实需要随机访问迭代器的能力,补充实现随机访问迭代器要求的所有运算符,示例补充代码如下:
struct Iterator { using iterator_category = std::random_access_iterator_tag; using difference_type = std::ptrdiff_t; using value_type = T; using pointer = T*; using reference = T&; Iterator(pointer ptr) : m_ptr(ptr) {} reference operator*() const { return *m_ptr; } pointer operator->() { return m_ptr; } Iterator& operator++() { m_ptr++; return *this; } Iterator operator++(int) { Iterator tmp = *this; ++(*this); return tmp; } // 以下为随机访问迭代器需要补充的运算符 Iterator& operator--() { m_ptr--; return *this; } Iterator operator--(int) { Iterator tmp = *this; --(*this); return tmp; } Iterator& operator+=(difference_type n) { m_ptr += n; return *this; } Iterator operator+(difference_type n) const { return Iterator(m_ptr + n); } Iterator& operator-=(difference_type n) { m_ptr -= n; return *this; } Iterator operator-(difference_type n) const { return Iterator(m_ptr - n); } difference_type operator-(const Iterator& other) const { return m_ptr - other.m_ptr; } reference operator[](difference_type n) const { return m_ptr[n]; } friend bool operator== (const Iterator& a, const Iterator& b) { return a.m_ptr == b.m_ptr; }; friend bool operator!= (const Iterator& a, const Iterator& b) { return a.m_ptr != b.m_ptr; }; friend bool operator<(const Iterator& a, const Iterator& b) { return a.m_ptr < b.m_ptr; } friend bool operator>(const Iterator& a, const Iterator& b) { return a.m_ptr > b.m_ptr; } friend bool operator<=(const Iterator& a, const Iterator& b) { return a.m_ptr <= b.m_ptr; } friend bool operator>=(const Iterator& a, const Iterator& b) { return a.m_ptr >= b.m_ptr; } private: pointer m_ptr; };
内容的提问来源于stack exchange,提问作者user1407220
相关产品推荐
相关产品推荐

