代码之家  ›  专栏  ›  技术社区  ›  mip

对于STL容器类,是否有一个C++与java的集合接口等价?

  •  3
  • mip  · 技术社区  · 15 年前

    我想传递任意容器作为函数的参数,并对其进行迭代(不删除或推送元素)。不幸的是,似乎没有标准的方法来做这件事。

    CollectionInterface )由包装STL容器的类实现。因此函数声明如下所示:

    f(const CollectionInterface * collection);
    

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

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

    你认为哪种方式更好?

    3 回复  |  直到 15 年前
        1
  •  7
  •   Matthew Flaschen    15 年前

    ForwardIterator ? 这是一种 InputIterator (或outputierator)也允许多过程算法(增加它不会使先前的值无效)。

    迭代器(与java迭代器非常不同)是C++集合的中心线程。对于处理它们的算法示例(以及相关的迭代器类型需求),可以从 <algorithm> . 特别地, search 提供使用ForwardIterator的示例。它找到范围内的第一个匹配项 [first1, last1] [first2, last2) . 这些都是符合 ForwardIterator

        2
  •  4
  •   Dennis Zickefoose    15 年前

    如果您希望以这种方式处理事情,还可以编写接受整个容器而不是引用的方法。标准库容器中的迭代器都是通过成员函数提供的 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
    }
    

    开始() 结束() 函数,并且可以提供所需的任何显式子范围。但有时这种方法是合适的。

        3
  •  4
  •   fredoverflow    15 年前

    我想传递任意容器作为函数的参数,并对其进行迭代(不删除或推送元素)。

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

    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::accumulate std::find_if