【发布时间】:2017-02-03 12:32:30
【问题描述】:
我已经定义了 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 对象,数组中的整数表示四个节点对象的id。
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中是否有任何有用的方法可以有效地解决我的问题?
【问题讨论】:
-
顺便说一句,如果您保证
element只拥有 4 个node实例,那么std::array可能是比std::vector更好的选择。 -
所以听起来你有一个图表,概念上。您可能需要根据某些计算的重要性重新考虑您的模型。元素实际上是可以用邻接表表示的子图。找到边界元素将包括从某个集合 i 中减去所有其他集合的并集。 .我不知道这是否对您有任何帮助,但也许从集合和图论重新思考设计可能会对您有所帮助。
-
如前所述,对静态大小的向量使用 std::array 并在 for 循环中使用 const 引用:for (const auto &iter: m_elements)
标签: c++ algorithm stl set std-pair