From d190113cb2066c10d309fd4a278b1e6c2d1fec54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=9D=D0=B8=D0=BA?= =?UTF-8?q?=D1=83=D0=BB=D0=BA=D0=B8=D0=BD?= Date: Fri, 12 Nov 2021 11:04:02 +0000 Subject: [PATCH] Update MeshLoader.cpp --- src/MeshLoader.cpp | 50 +++++++++++----------------------------------- 1 file changed, 12 insertions(+), 38 deletions(-) diff --git a/src/MeshLoader.cpp b/src/MeshLoader.cpp index 7c4ed62..fc4c200 100644 --- a/src/MeshLoader.cpp +++ b/src/MeshLoader.cpp @@ -20,16 +20,14 @@ void MeshLoader::PrintData() { void MeshLoader::TransformElementsToQuadr() { std::unordered_set ribs; - for (auto& iter : finite_elements) { //!!! Непонятное имя - это не итератор - std::vector cur_nodes(iter.nodes_id); + for (auto& el : finite_elements) { + std::vector cur_nodes(el.nodes_id); for (auto i = cur_nodes.begin(); i < cur_nodes.end(); ++i) { for (auto j = i + 1; j < cur_nodes.end(); ++j) { Rib cur_rib(*i, *j, 0); - - //!!! Потеря преимуществ контейнера. Неэффективно. - auto found_rib = std::find(ribs.begin(), ribs.end(), cur_rib); + auto found_rib = ribs.find(cur_rib); if (found_rib == ribs.end()) { Node left_node = GetNodeById(*i); @@ -43,18 +41,18 @@ void MeshLoader::TransformElementsToQuadr() { false); cur_rib.UpdateCenter(center_id_); - nodes.push_back(center_node); //!!! std::move - iter.nodes_id.push_back(center_id_); + std::move(center_node); + el.nodes_id.push_back(center_id_); ribs.insert(cur_rib); } else { - iter.nodes_id.push_back(found_rib->center_id); + el.nodes_id.push_back(found_rib->center_id); } } } - iter.nodes_id.shrink_to_fit(); + el.nodes_id.shrink_to_fit(); } for (auto& it : boundary_finite_elements) { @@ -63,9 +61,7 @@ void MeshLoader::TransformElementsToQuadr() { for (auto i = cur_nodes.begin(); i < cur_nodes.end() - 1; ++i) { for (auto j = i + 1; j < cur_nodes.end(); ++j) { Rib cur_rib(*i, *j, 0); - - //!!! Потеря преимуществ контейнера. Неэффективно. - auto found_rib = std::find(ribs.begin(), ribs.end(), cur_rib); + auto found_rib = ribs.find(cur_rib); if (found_rib != ribs.end()) { it.nodes_id.push_back(found_rib->center_id); @@ -81,24 +77,7 @@ void MeshLoader::TransformElementsToQuadr() { } Node MeshLoader::GetNodeById(int n_id) { - - //!!! Не могу понять, зачем такие сложности. Тут одна строка всего должна быть. - - int left = 0; - int right = nodes.size(); - int mid; - while (true) { - mid = (left + right) / 2; - if (n_id < nodes[mid].id) - right = mid - 1; - else if (n_id > nodes[mid].id) - left = mid + 1; - else - return nodes[mid]; - - if (left > right) - return {}; - } + return nodes[n_id]; } std::vector& MeshLoader::Nodes() { @@ -111,18 +90,13 @@ std::vector MeshLoader::VertexNodesBySurfaceId(int s_id) { auto last_iter = boundary_finite_elements.end(); while (cur_iter != last_iter) { - cur_iter = std::find_if(cur_iter, last_iter, [s_id](BoundaryFiniteElement& s) { //!!! Где const у s + cur_iter = std::find_if(cur_iter, last_iter, [s_id](const BoundaryFiniteElement& s) { return s.rib_id == s_id; }); if (cur_iter != last_iter) { - for (const auto& it : cur_iter->nodes_id) { //!!! it не итератор - переименуйте - - //!!! Крайне не эффективно - auto node_by_id = std::find_if(nodes.begin(), nodes.end(), [it](Node& n) {//!!! Где const у n - return n.id == it; - }); - ans.insert(*node_by_id); + for (const auto& cur : cur_iter->nodes_id) { + ans.insert(GetNodeById(s_id)); } ++cur_iter; -- GitLab