vector<struct> 的自定义迭代器

Posted

技术标签:

【中文标题】vector<struct> 的自定义迭代器【英文标题】:custom iterator for 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。 【参考方案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

【讨论】:

以上是关于vector<struct> 的自定义迭代器的主要内容,如果未能解决你的问题,请参考以下文章

C++ vector<Struct> 排序不起作用

Practice3_2_vector_sort_struct

C++ 传递一个向量<vector<STRUCT>> 进行修改

为 std::vector<struct> 创建一个 getter 函数

如何根据特定标准在 vector<struct> 中使用 count() 函数

在声明时定义vector的vector的大小