重写迭代器的运算符*()

Overriding operator*() of iterators

本文关键字:运算符 迭代器 重写      更新时间:2023-10-16

假设我有一些用户定义的复杂结构,比如

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:是否有一种标准的方法来覆盖InputIteratoroperator*()(在本例中为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)来允许直接比较。