使用STL c++创建传递对集
Making a Transitive Pair Set using STL C++
我想创建一个具有传递对的集合。我的输入形式是pair<int, int>
我需要一个集合它包含给定输入的所有传递对。例如,如果我有一对{1,2}{2,1}{2,3}{3,4}作为输入,那么我需要一个包含一对{{1,2},{2,1},{1,3},{3,4},{1,4},{2,4}的SET。我还需要找出一个给定的对是否属于这个传递集合。是否有任何内置的数据结构/STL库允许我在c++中完成此操作?
你有一个图,你想把它变成一个自由类别,也就是那个图的传递闭包。
你的int
对元素是顶点,这些对本身是边,这就是你的图。图上的自由范畴是有边合成定律的图,以及所有由该定律产生的附加边。法律规定
- 如果有一个边(或"箭头"作为范畴理论命名它)
f
从a
运行到b
- 和从
b
到c
的边缘g
- 然后还有另一条边
f∘g
从a
到c
- 组合是关联的(
(f∘g)∘h = f∘(g∘h)
)
(每个类别也有单位边,标记为1
a
,从a
到a
对于每个顶点a
,以及一个定律,即对于每个从a
到b
的箭头f
, 1
a
∘f = f∘1
b
= f
,但我们不谈论这些)。
在此完成本回答的通识教育部分。
c++标准库中没有相关的算法,但您可能想要检查boost::graph
或任何其他面向图形的库。boost::graph
有transitive_closure
方法,这正是你想要的。
你可以用:
set<pair<int, int>> myset;
传递闭包可以这样计算:
void transitive_closure(set<pair<int, int>>& s)
{
set<pair<int, int>> a; // missing nodes to add
for (auto i = s.cbegin(); i != s.cend(); i++)
{
for (auto j = i; ++j != s.cend(); j)
{
if (i->second == j->first
&& i->first != j->second
&& s.count(make_pair(i->first, j->second))==0 )
a.insert(make_pair(i->first, j->second));
}
}
if (!a.empty()) {
for (auto p : a)
s.insert(p);
transitive_closure(s);
}
}
这不是最优化的算法,因为递归会重复一些比较。但它是有效的。顺便说一下,我想你忘记了结果集中的{2,3}。
要检查一对是否属于集合,只需检查s.count(make_pair(i->first, j->second)!=0
相关文章:
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 使用 stl 库创建图形是如何工作的?
- 在多个 STL 对对象上创建迭代器
- 哪些更好的方法可以显示使用C STL创建的堆栈而不弹出每个元素的方法
- C++ STL:在创建 std::string 的 const 副本时将更改 c_str()
- 从 STL 优先级队列创建最小堆
- 在类中创建多维STL向量
- 基于输入数据创建 STL 向量 - 标量或复杂类型
- 如何在C++中使用 STL 列表创建循环
- 如何创建一个在 C++11 (STL) 中压缩两个元组的函数
- 我正在尝试为我的 DynamicArray 类创建一个迭代器。为什么 STL 排序不适用于我的迭代器?
- 使用 STL 向量创建矩阵
- 用于创建和遍历图形的 STL 容器
- 如何使用 ICU 中的非 stl 类型(如 UnicodeString)创建unordered_map
- 如何在没有STL的情况下用c++中的Key创建和访问内存块
- 如何使用 STL 的 copy() 从现有向量创建新向量?
- 正在创建STL最小堆优先级队列
- 在C#中创建一个STL std::set并封送到C++
- 从迭代器c++对创建stl向量
- 创建STL映射键迭代器