是否有一个C ++等同于Java的STL容器类的Collection接口?

时间:2010-06-21 23:51:31

标签: c++ stl collections containers function-templates

我想传递任意容器作为函数的参数并迭代它(没有擦除也没有推送元素)。不幸的是,似乎没有标准的方法来做到这一点。

我想到的第一个解决方案是一个接口(让我们称之为CollectionInterface)由将包装STL容器的类实现。所以函数声明看起来像:

f(const CollectionInterface * collection);

或者,我正在考虑方法模板,它具有在编译时保持绑定的优点:

template <class CONTAINER> void f(const CONTAINER & collection);

您认为哪种方式更好?

3 个答案:

答案 0 :(得分:7)

ForwardIterator?这是一种InputIterator(或OutputIterator),它也允许多次传递算法(递增它不会使先前值无效)。

迭代器(与Java迭代器完全不同)是统一C ++集合的核心线程。有关处理它们的算法(以及相关的迭代器类型要求)的示例,您可以从<algorithm>开始。特别是,search提供了使用ForwardIterator的示例。它在范围[first1, last1]定义的序列的[first2, last2)范围内找到第一个匹配项。这些都是符合ForwardIterator

要求的对象

答案 1 :(得分:4)

如果这是您想要处理的方式,您也可以编写接受整个容器而不是引用的方法。标准库容器中的迭代器都是通过成员函数begin()end()提供的,或者在某些情况下rbegin()rend()提供,以便向后迭代。模板的工作方式,您不必创建对象派生的实际接口类型;而是使用对象推断出需求。

template<typename Container> void Function(const Container& c) {
    for(typename Container::const_iterator i = c.begin(), end = c.end(); i != end; ++i)
       //do something
}

传递迭代器在使用函数时提供了更大的灵活性,特别是因为并非所有迭代器都来自具有显式begin()end()函数的容器,并且您可以提供所需的任何显式子范围。但有时这种方法是合适的。

答案 2 :(得分:4)

  

我想传递任意容器作为函数的参数并迭代它(没有擦除也没有推送元素)。

传递迭代器。以下是实施和使用的示例:

template <typename Iter>
void function(Iter begin, Iter end)
{
    for (Iter it = begin; it != end; ++it)
    {
        std::cout << *it << std::endl;
    }
}

int main()
{
    std::string array[] = {"hello", "array", "world"};
    function(array, array + 3);

    std::vector<std::string> vec = {"hello", "vector", "world"};
    function(vec.begin(), vec.end());
}

请注意,在许多情况下,您实际上并不需要编写该函数,但您可以使用库工具来编写它,然后只需对其应用std::for_each。或者甚至更好,使用预先存在的算法,如std::accumulatestd::find_if