Я определил class element
и class node
.Какая наилучшая структура данных для поиска и подсчета пар объектов в векторе векторов
класс элемент
class element
{
int id;
std::vector<node> m_nodes; // An element consist of 4 nodes.
public:
getnode(int) // return n-th node;
}
класс узла
class node
{
int id;
// other members
}
class model
состоят из целых node
и element
объектов. class element
объект состоит из вектора из четырех node
объектов. Пара двух последовательных (смежных) объектов node
называется лицом.
Пример:
elem1: {1,2,3,4}
elem2: {3,5,6,4}
elem1 и elem2 два element
объекты и целые числа в массиве представляют собой идентификаторы четыре узла.
1-2, 2-3, 3-4 и 4-1 являются гранями elem1. и 3-5, 5-6, 6-4 и 4-3 являются гранями elem2. лицо 3-4 и лицо 4-3 идентичны и, следовательно, разделяются обоими элементами.
Элемент границы - это элемент, состоящий из по меньшей мере одной грани, которая не разделяется другими элементами. В приведенном выше примере оба элемента elem1 и elem2 являются граничными элементами. В классе модели также определен вектор граничных элементов.
модель класса
class model
{
std::vector<node> m_nodes;
std::vector<element>m_elements;
std::vector<element>m_boundary;
public:
void set_boundary_elements();
}
ПРОБЛЕМА: Как инициализирует вектор граничных элементов
Это псевдокод из set_boundary_elements (функции).
void model::set_boundary_elements()
{
std::vector <std::pair<std::set<int> , int >> faces;
std::set<int> s;
for(auto iter::m_elements)
{
//initialise face.
for(int i=1; i<5; ++i)
{
if(i != 4)
{
s.insert(iter.getnode(i));
s.insert(iter.getnode(i+1));
}
else
{
s.insert(iter.getnode(4));s.insert(iter.getnode(1));
}
for(auto it: faces)
{
if(s== it.first)
(it.second)++; break;
}
faces.push_back(s,1);
}
//then push_back the elements which have nonshared faces, into m_boundary.
}
}
Я считаю, что мой алгоритм неэффективен, поскольку для добавления лица каждый раз, когда мне приходится проходить через все грани. Есть ли какой-либо полезный метод в stl/algorithm для эффективного решения моей проблемы?
Как и в сторону, если вам гарантируется, что в элементе 'всегда есть только 4' node', тогда 'std :: array' может быть лучшим выбором, чем' std :: vector'. – AndyG
Похоже, у вас есть график, концептуально. Вы можете подумать о своей модели в зависимости от того, насколько важны некоторые вычисления. Элемент действительно является подграфом, который может быть представлен списком смежности. Поиск граничных элементов состоял бы в вычитании объединения всех остальных множеств из некоторого множества i. , Я не знаю, поможет ли вам это, но, возможно, переосмысление дизайна из теории множеств и графов может помочь вам. – AndyG
Как уже говорилось, используйте std :: array для векторов статического размера и используйте ссылки const в ваших циклах: для (const auto & iter: m_elements) – gabry