如何在C ++中仅在容器内的类的成员上获取迭代器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中仅在容器内的类的成员上获取迭代器相关的知识,希望对你有一定的参考价值。

在C ++中,我想知道是否有一种方法可以获得一个迭代器,它只包含一个容器中包含的类的特定成员。 情况如下。

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类已经有weight。 所以我想得到一个可以按如下方式初始化然后遍历的迭代器。

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 ++中仅在容器内的类的成员上获取迭代器的主要内容,如果未能解决你的问题,请参考以下文章

从 api 获取所有数据以及如何在 swift ios 中仅在单元格上附加标题

如何从可滚动容器中仅选择可见元素?

如何在joomla组件中仅获取和显示选中的项目

如何在 Mailchimp 中仅获取成员字段名称(电子邮件地址、名字、姓氏)

[如何在C ++中仅使用迭代器来正确地迭代3D向量? [关闭]

如何在 Spark Streaming 中仅在新批次上重新训练模型(不采用以前的训练数据集)?