重写迭代器的运算符*()
Overriding operator*() of iterators
假设我有一些用户定义的复杂结构,比如
struct usrStruct{
double a;
T1 b;
T2 c;
/* and so on...*/
}
它被用作std::vector、std::list或任何可迭代的的基本元素。。
假设std::vector<usrStruct>
通过迭代器传递给我的一个函数
template<class InputIterator>
T myFoo( InputIterator first, InputIterator last ){ /*...*/ }.
Q:是否有一种标准的方法来覆盖InputIterator
的operator*()
(在本例中为std::vector<usrStruct>::iterator
),以便myFoo
仅与成员a
交互?
即,使得
*first == (*first).a;
因此CCD_ 7相对于CCD_?
谢谢。
您可以在vector::iterator
的基础上创建一个新的iterator
,并将其反映为双值,这非常简单:
template< class BaseIterator >
struct custom_iterator :
std::iterator<std::iterate_traits<BaseIterator>::iterator_category, double>
{
public:
typedef std::iterator<std::iterate_traits<BaseIterator>::iterator_category, double>
base_t;
typedef typename base_t::reference reference;
public:
custom_iterator( BaseIterator it ) : m_it( it ) {}
public:
reference operator*() const {
return my_it->a;
}
custom_iterator& operator++ () {++m_it; return *this;}
custom_iterator operator++ (int) {
custom_iterator tmp( *this );
++m_it;
return *this;
}
bool operator==( custom_iterator const& rhs ) const {
return m_it == rhs.m_it;
}
private:
BaseIterator m_it;
};
现在您可以将其用作myFoo( custom_iterator(v.begin()), custom_iterator(v.end()) )
不,你不能那样做。您可以使结构隐式转换为双精度(通过operator double
)。或者,您可以通过重载operator==(usrSruct,double)
和/或operator==(double,usrStruct)
来允许直接比较。
相关文章:
- 迭代器类的重载前缀增量运算符会引发分段错误
- 了解运算符重载和迭代器,为什么它会打印出"wrhrwwr"?
- 映射迭代器与运算符不匹配
- 提供运算符+或运算符到双向迭代器有什么缺点吗?
- 无法使用迭代器查找类对象。(二进制 '==': 'userInfo' 不定义此运算符)
- 迭代器和无符号整数的重载 + 运算符
- 迭代器的范围 TS 和 C++20 概念是否需要能够使用"运算符>"?
- C++ 使用矢量迭代器时的运算符优先级
- 在 c++ 迭代器中,我应该同时定义运算符== 和运算符!=吗?
- 迭代器关系运算符出错(带单独链接和迭代器的自定义哈希表)
- 为什么 std::list 迭代器没有运算符+
- 如何让迭代器使用赋值运算符对列表进行操作
- 迭代器和增量运算符
- 为什么我们要把 :: (范围重新定位运算符)放在迭代器之前
- Gnu 的 <Iterator>reverse_iterator::运算符>和代理迭代器
- 输入迭代器 - 星号和后缀运算符
- 后缀运算符链表泛型节点迭代器
- 在自定义双链接列表中的自定义迭代器的取消运算符,找不到二进制操作员
- 与运算符"!="不匹配(c++ 迭代器)
- 在地图迭代器上不支持非仿制地图上的平等运算符(==)