2014-02-20 253 views
1

定制迭代器假设我有一个struct这样的:矢量<struct>

struct S 
{ 
    int a; 
    string b; 
    //.... 
}; 

,我有这个struct的向量:

vector<S> vect(100); 

我想有random_access iterator指向所有的vect int的成员(在这种情况下) 我该如何实现它?

+1

您需要实现在http://en.cppreference.com/w/说明什么cpp/concept/RandomAccessIterator你试过了吗?你的代码在哪里?你卡在哪里? (它应该与为所有S编写一个迭代器非常相似,除了解引用之外,您将单独返回一个['const']引用到'a'。 –

+4

如果Boost库是一个选项,请考虑transform_iterator。 – jrok

回答

1

一种优雅的方式可能是运营商*超载,direcly内部结构:

struct S { 
    int a; 
    string b; 
    inline int operator*() const { 
     return a; 
    } 
}; 

这样,当你重复小号元素矢量,您可以访问到 'A' 在这个简单的方法:

std::vector<S*> vect(100); 
std::vector<S*>::iterator it = vect.begin(); 
for(; it != vect.end(); ++it) { 
    std::cout << **it; 
} 

有:

  • *它:通过迭代器你访问元素指针
  • **它:访问元素的感谢超载
2

只是包装std::vector<S>::iterator。所有运营商可以直接转发除了operator*这当然必须返回S::a

+0

而'operator - >',并且“当然必须通过引用*返回S :: a”* –

+0

@TonyD:即使'operator *'也必须,因为'* it = 5'也必须合法。 – MSalters

相关问题