Skip to content

Commit 6d560f1

Browse files
committed
add graph class methods: GetEdgeIter, SetEdgeWeight
1 parent fc5f0d2 commit 6d560f1

File tree

2 files changed

+67
-32
lines changed

2 files changed

+67
-32
lines changed

lib/src/graph/graph.hpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,16 @@ class Graph {
277277
*/
278278
weight_t GetEdgeWeight(const std::pair<vert_t, vert_t>& edge) const;
279279

280+
/**
281+
* @brief Меняет вес ребра в взвешенном графе
282+
* @param edge: ребро
283+
* @param new_weight: вес
284+
* @throw `std::logic_error("SetEdgeWeight: graph is not weighted.")`
285+
* @throw `std::invalid_argument("SetEdgeWeight: there is no such edge:")`
286+
*/
287+
void SetEdgeWeight(const std::pair<vert_t, vert_t>& edge,
288+
weight_t new_weight);
289+
280290
void AddVert(vert_t vert);
281291

282292
/// @throw `std::invalid_argument(std::string("AddEdge: ") + ex.what())`
@@ -323,6 +333,8 @@ class Graph {
323333

324334
weight_t Weight() const { return weight_; }
325335

336+
void SetWeight(weight_t new_weight) { weight_ = new_weight; }
337+
326338
// friend Graph;
327339

328340
bool operator==(const Edge& rhs) const {
@@ -359,6 +371,43 @@ class Graph {
359371

360372
static std::pair<vert_t, vert_t> ParseEdgeString_(
361373
const std::string& edge_str);
374+
375+
auto GetEdgeIter(const std::pair<vert_t, vert_t>& edge) const {
376+
auto [start_vert, end_vert] = edge;
377+
378+
return std::find_if(
379+
edges_.begin(), edges_.end(),
380+
[start_vert, end_vert, this](const auto& e) {
381+
return (e.StartVert() == start_vert && e.EndVert() == end_vert) ||
382+
(!IsDirected() && e.StartVert() == end_vert &&
383+
e.EndVert() == start_vert);
384+
});
385+
}
386+
387+
auto GetEdgeIter(const std::pair<vert_t, vert_t>& edge) {
388+
auto [start_vert, end_vert] = edge;
389+
390+
return std::find_if(
391+
edges_.begin(), edges_.end(),
392+
[start_vert, end_vert, this](const auto& e) {
393+
return (e.StartVert() == start_vert && e.EndVert() == end_vert) ||
394+
(!IsDirected() && e.StartVert() == end_vert &&
395+
e.EndVert() == start_vert);
396+
});
397+
}
398+
399+
auto GetEdgeIter(const std::tuple<vert_t, vert_t, weight_t>& edge) const {
400+
auto [start_vert, end_vert, weight] = edge;
401+
402+
return std::find_if(
403+
edges_.begin(), edges_.end(),
404+
[start_vert, end_vert, weight, this](const auto& e) {
405+
return (e.StartVert() == start_vert && e.EndVert() == end_vert &&
406+
e.Weight() == weight) ||
407+
(!IsDirected() && e.StartVert() == end_vert &&
408+
e.EndVert() == start_vert && e.Weight() == weight);
409+
});
410+
}
362411
};
363412

364413
template <AllowedVertType vert_t, AllowedWeightType weight_t>

lib/src/graph/graph_methods.cpp

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -113,34 +113,13 @@ bool Graph<vert_t, weight_t>::ContainsEdge(
113113
if (!IsWeighted())
114114
throw std::logic_error("ContainsEdge: graph is not weighted.");
115115

116-
auto [start_vert, end_vert, weight] = edge;
117-
118-
auto it =
119-
std::find_if(edges_.begin(), edges_.end(),
120-
[start_vert, end_vert, weight, this](const auto& e) {
121-
return (e.StartVert() == start_vert &&
122-
e.EndVert() == end_vert && e.Weight() == weight) ||
123-
(!IsDirected() && e.StartVert() == end_vert &&
124-
e.EndVert() == start_vert && e.Weight() == weight);
125-
});
126-
127-
return it != edges_.end();
116+
return GetEdgeIter(edge) != edges_.end();
128117
}
129118

130119
template <AllowedVertType vert_t, AllowedWeightType weight_t>
131120
bool Graph<vert_t, weight_t>::ContainsEdge(
132121
const std::pair<vert_t, vert_t>& edge) const {
133-
auto [start_vert, end_vert] = edge;
134-
135-
auto it = std::find_if(
136-
edges_.begin(), edges_.end(),
137-
[start_vert, end_vert, this](const auto& e) {
138-
return (e.StartVert() == start_vert && e.EndVert() == end_vert) ||
139-
(!IsDirected() && e.StartVert() == end_vert &&
140-
e.EndVert() == start_vert);
141-
});
142-
143-
return it != edges_.end();
122+
return GetEdgeIter(edge) != edges_.end();
144123
}
145124

146125
template <AllowedVertType vert_t, AllowedWeightType weight_t>
@@ -149,15 +128,7 @@ weight_t Graph<vert_t, weight_t>::GetEdgeWeight(
149128
if (!IsWeighted())
150129
throw std::logic_error("GetEdgeWeight: graph is not weighted.");
151130

152-
auto [start_vert, end_vert] = edge;
153-
154-
auto it = std::find_if(
155-
edges_.begin(), edges_.end(),
156-
[start_vert, end_vert, this](const auto& e) {
157-
return (e.StartVert() == start_vert && e.EndVert() == end_vert) ||
158-
(!IsDirected() && e.StartVert() == end_vert &&
159-
e.EndVert() == start_vert);
160-
});
131+
auto it = GetEdgeIter(edge);
161132

162133
if (it == edges_.end())
163134
throw std::invalid_argument("GetEdgeWeight: there is no such edge: " +
@@ -166,6 +137,21 @@ weight_t Graph<vert_t, weight_t>::GetEdgeWeight(
166137
return it->Weight();
167138
}
168139

140+
template <AllowedVertType vert_t, AllowedWeightType weight_t>
141+
void Graph<vert_t, weight_t>::SetEdgeWeight(
142+
const std::pair<vert_t, vert_t>& edge, weight_t new_weight) {
143+
if (!IsWeighted())
144+
throw std::logic_error("SetEdgeWeight: graph is not weighted.");
145+
146+
auto it = GetEdgeIter(edge);
147+
148+
if (it == edges_.end())
149+
throw std::invalid_argument("SetEdgeWeight: there is no such edge: " +
150+
Edge(edge).Name());
151+
152+
it->SetWeight(new_weight);
153+
}
154+
169155
template <AllowedVertType vert_t, AllowedWeightType weight_t>
170156
void Graph<vert_t, weight_t>::AddVert(vert_t vert) {
171157
if (!Contains(verts_, vert)) verts_.push_back(vert);

0 commit comments

Comments
 (0)