我正在用C ++进行计算,它必须尽可能快(每秒执行60次,可能有大量数据)。在计算过程中,必须处理一组特定项目。但是,在不同情况下,项目存储的不同实现是最佳的,因此我需要使用抽象类。
我的问题是,对C ++中的每个项目执行操作的最常见和最有效的方法是什么? (在此期间我不需要改变容器的结构。)我想到了两种可能的解决方案:
为存储类创建迭代器。 (它们也是我的,所以我可以添加它。)这在Java中很常见,但对我来说似乎不是'C':
class Iterator {
public:
bool more() const;
Item * next();
}
添加一个抽象处理程序,它将在计算部分中被覆盖,并包含要在每个项目上调用的代码:
class Handler {
public:
virtual void process(Item &item) = 0;
}
(只有一个函数指针是不够的,因为它还必须带来一些其他数据。)
完全不同的东西?
第二个选项似乎对我来说好一点,因为这些项目实际上可以在一个循环中处理而不会中断,但它会使代码非常混乱,因为我必须制作相当多的派生类。你会建议什么?
感谢。
编辑:更确切地说,存储数据类型不仅仅是ADT,它只能根据某些参数查找其中元素的特定子集,我需要进行处理,所以我无法在数组或其他东西中准备所有这些。
答案 0 :(得分:3)
#include <algorithm>
查看C ++标准提供的现有容器以及for_each
等函数。
有关C ++容器迭代与“现代”语言中接口的比较,请参阅this answer of mine。其他答案都有很好的例子说明在实践中惯用的C ++方式。
使用模板化仿函数,正如标准容器和算法所做的那样,肯定会比虚拟分派更快地提供速度优势(尽管有时编译器可以对调用进行虚拟化,但不要依赖它)。
答案 1 :(得分:3)
C ++已经有了迭代器。它不是特别“Java”的东西。 (请注意,它们的界面不同,并且它们比Java等价物更有效)
至于第二种方法,如果你担心吞吐量,那么为每个元素调用虚函数会损害性能。
如果您可以(预)对数据进行排序,以便连续存储相同类型的所有对象,则可以选择要调用一次的函数,然后将其应用于所有元素那种类型。否则,您将不得不通过虚函数或其他机制的间接/类型检查来为每个元素执行适当的操作。
答案 2 :(得分:1)
是什么让你觉得迭代器不是很像C ++?标准库中充满了它们(参见this),并包含各种算法,可用于在各种标准容器类型上有效地执行任务。
如果您使用STL容器,您可以节省重新发明轮子并轻松访问各种预定义算法。这几乎总是比使用ad-hoc迭代解决方案编写自己的等效容器更好。
答案 3 :(得分:0)
可能是一个功能模板:
template <typename C>
void process(C & c)
{
typedef typename C::value_type type;
for (type & x : c) { do_something_with(x); }
}
迭代将使用容器迭代器,这通常与您可以获得的效率一样高。
您可以专门为特定容器设置模板。