如何在 C++ 中的容器内仅获取 class 成员的迭代器
How to get iterator over only the members of a class inside a container in C++
在C++中,我想知道是否有一种方法可以得到一个迭代器,当它包含在容器中时,它只遍历class的特定成员。
情况如下。
class Edge : public std::pair<int, int> {
private:
int length;
public:
int weight;
Edge::Edge(int v1, int v2): std::pair<int, int>(v1, v2) { }
}
int main() {
enum nodes { A, B, C, D, E };
const int num_nodes = 5;
vector<Edge> edge_vec = { Edge(A, C), Edge(C, D), Edge(B, D), Edge(B, E) };
int weights[] = { 1, 2, 7, 3 }; // I don't like this part.
graph_t g(edge_vec.begin(), edge_vec.end(), weights, num_nodes);
}
graph_t
的定义是graph_t (,, Iterable,);
。
因此,任何 Iterable 都可以作为第三个参数赋值。
问题是这样的
我不想使用单独的 int weights[]
数组,因为 Edge class 已经有 weight
.
所以我想得到一个可以如下初始化然后遍历的Iterator。
edge_vec[0].weight = 1;
edge_vec[1].weight = 2;
edge_vec[2].weight = 7;
edge_vec[3].weight = 3;
在这种情况下,weight
经常更新,所以我想用指针而不是单独数据结构中的副本来访问它。
处理这个问题最有效和优雅的方法是什么?
#include <boost/iterator/transform_iterator.hpp>
// ...
boost::transform_iterator wbegin(edge_vec.begin(), std::mem_fn(&Edge::weight));
boost::transform_iterator wend(edge_vec.end(), std::mem_fn(&Edge::weight));
在C++中,我想知道是否有一种方法可以得到一个迭代器,当它包含在容器中时,它只遍历class的特定成员。
情况如下。
class Edge : public std::pair<int, int> {
private:
int length;
public:
int weight;
Edge::Edge(int v1, int v2): std::pair<int, int>(v1, v2) { }
}
int main() {
enum nodes { A, B, C, D, E };
const int num_nodes = 5;
vector<Edge> edge_vec = { Edge(A, C), Edge(C, D), Edge(B, D), Edge(B, E) };
int weights[] = { 1, 2, 7, 3 }; // I don't like this part.
graph_t g(edge_vec.begin(), edge_vec.end(), weights, num_nodes);
}
graph_t
的定义是graph_t (,, Iterable,);
。
因此,任何 Iterable 都可以作为第三个参数赋值。
问题是这样的
我不想使用单独的 int weights[]
数组,因为 Edge class 已经有 weight
.
所以我想得到一个可以如下初始化然后遍历的Iterator。
edge_vec[0].weight = 1;
edge_vec[1].weight = 2;
edge_vec[2].weight = 7;
edge_vec[3].weight = 3;
在这种情况下,weight
经常更新,所以我想用指针而不是单独数据结构中的副本来访问它。
处理这个问题最有效和优雅的方法是什么?
#include <boost/iterator/transform_iterator.hpp>
// ...
boost::transform_iterator wbegin(edge_vec.begin(), std::mem_fn(&Edge::weight));
boost::transform_iterator wend(edge_vec.end(), std::mem_fn(&Edge::weight));