【问题标题】:custom iterator for vector<struct>vector<struct> 的自定义迭代器
【发布时间】:2014-02-20 08:12:34
【问题描述】:

假设我有一个这样的struct

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

我有一个struct 的向量:

   vector<S> vect(100);

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

【问题讨论】:

  • en.cppreference.com/w/cpp/concept/RandomAccessIterator描述了你需要实现的东西你试过了吗?你的代码在哪里?你在哪里卡住了? (这应该很像为所有 S 编写迭代器,除了在取消引用时,您将返回一个 [const] 对 a 的引用。
  • 如果可以选择 Boost 库,请考虑 transform_iterator。

标签: c++ c++11 vector struct iterator


【解决方案1】:

只需包装一个std::vector&lt;S&gt;::iterator。除operator*外,所有算子都可以直接转发,当然要返回S::a

【讨论】:

  • 还有operator-&gt;,而且“当然要返回S::a”引用
  • @TonyD:即使operator* 也必须这样做,因为*it = 5 也必须是合法的。
【解决方案2】:

一种优雅的方式可能是 operator* 重载,直接在 struct 内部:

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

这样,当你在vector中迭代S个元素时,你可以通过这种简单的方式访问'a':

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

与:

  • *it:通过迭代器访问元素指针
  • **it:通过重载访问元素a

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2015-02-04
    • 2016-06-18
    • 2016-04-05
    • 2021-09-15
    • 2015-11-19
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多