处理未知容器中所有项目的最有效方法?

时间:2012-02-06 23:00:21

标签: c++

我正在用C ++进行计算,它必须尽可能快(每秒执行60次,可能有大量数据)。在计算过程中,必须处理一组特定项目。但是,在不同情况下,项目存储的不同实现是最佳的,因此我需要使用抽象类。

我的问题是,对C ++中的每个项目执行操作的最常见和最有效的方法是什么? (在此期间我不需要改变容器的结构。)我想到了两种可能的解决方案:

  1. 为存储类创建迭代器。 (它们也是我的,所以我可以添加它。)这在Java中很常见,但对我来说似乎不是'C':

    class Iterator {
    public:
        bool more() const;
        Item * next();
    }
    
  2. 添加一个抽象处理程序,它将在计算部分中被覆盖,并包含要在每个项目上调用的代码:

    class Handler {
    public:
        virtual void process(Item &item) = 0;
    }
    

    (只有一个函数指针是不够的,因为它还必须带来一些其他数据。)

  3. 完全不同的东西?

  4. 第二个选项似乎对我来说好一点,因为这些项目实际上可以在一个循环中处理而不会中断,但它会使代码非常混乱,因为我必须制作相当多的派生类。你会建议什么?

    感谢。

    编辑:更确切地说,存储数据类型不仅仅是ADT,它只能根据某些参数查找其中元素的特定子集,我需要进行处理,所以我无法在数组或其他东西中准备所有这些。

4 个答案:

答案 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); }
}

迭代将使用容器迭代器,这通常与您可以获得的效率一样高。

您可以专门为特定容器设置模板。