3

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

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

f(const CollectionInterface * collection);

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

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

你认为哪种方式更好?

4

3 回答 3

7

前向迭代器?这是一种InputIterator(或 OutputIterator),它也允许多遍算法(递增它不会使先前的值无效)。

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

于 2010-06-21T23:52:18.993 回答
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()函数的容器,并且您可以提供所需的任何显式子范围。但有时这种方法是合适的。

于 2010-06-22T00:33:12.713 回答
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::accumulateor std::find_if

于 2010-06-22T00:45:39.523 回答