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