Как получить итератор только для членов класса внутри контейнера в C ++ - PullRequest
0 голосов
/ 03 сентября 2018

В 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 часто обновляется, поэтому я хочу получить к нему доступ с указателем, а не с копией в отдельной структуре данных.
Какой самый эффективный и элегантный способ справиться с этим?

1 Ответ

0 голосов
/ 03 сентября 2018
#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));
...