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<S>::iterator
。除operator*
外,所有算子都可以直接转发,当然要返回S::a
【讨论】:
还有operator->
,而且“当然要返回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> 的自定义迭代器的主要内容,如果未能解决你的问题,请参考以下文章
Practice3_2_vector_sort_struct
C++ 传递一个向量<vector<STRUCT>> 进行修改
为 std::vector<struct> 创建一个 getter 函数