我正在尝试找出以下问题的最佳实现:
假设我们有一个类A
,它代表一个复杂的数学对象,并且在构造时最初保持所有必需的内在状态。对于a_i
的每个对象A
,可以计算最终数值,这取决于其他a_j
j < i
和a_0
的非平凡方式众所周知。此外,导致最终答案的方程需要一个特殊的评估顺序,并且可以定义a_i
的比较运算符。
我想要做的是首先创建所有需要的a_i
,将它们推入一些有序的数据结构,最后以正确的顺序遍历结构以获得最终结果。
现在回答真正的问题:我通常使用哪种数据结构来实现评估订单的结构?二进制堆?或者我只是使用std :: vector并在之后对其进行排序?
谢谢!
答案 0 :(得分:1)
如果可以根据评估顺序定义a_i的比较运算符(比如说小于),则自然容器将是std :: set。使用std :: set :: iterator遍历地图将按递增顺序生成每个a_i,这将是您的评估顺序。例如
std::set<A> aMap;
A a_i;
... // You create the rest of the A's
aMap.insert(a_i);
aMap.insert(a_j);
for (std::set<A>::iterator aIter = aMap.begin(); aIter != aMap.end(); ++aIter) {
// Do your evaluation
}
答案 1 :(得分:0)
我建议使用矢量和交换功能。如果数学公式返回true,则循环遍历数组中的每个元素并与数组中的前一个元素交换。
你的循环必须循环遍历向量中的每个元素,并且内部还有一个循环,循环遍历当前索引向量项之前的所有元素。这个内部循环将包含您的数学公式检查,即排序逻辑。
希望这能让您了解该怎么做。如果您需要一些伪代码,请给我发表评论。