STL传递迭代器与容器

时间:2013-12-09 06:09:21

标签: c++ stl

如果我正在编写一个需要接收几个容器的库函数,哪个更好?

template <class Iterator1, class Iterator2>
void func_iterators(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2)

template <class Container1, class Container2>
void func_containers(const Container1 &c1, const Container2 &c2)

4 个答案:

答案 0 :(得分:5)

如果你可以使用迭代器表单,那么就做。这允许调用者更灵活 - 例如,他们可以传递反向迭代器,或者一些在其他地方发送值,执行锁定或任何需要的特殊用途迭代器。如果您需要的不仅仅是迭代器访问权限 - 例如,要调用.size() - 传递Container可能是更好的选择。

答案 1 :(得分:2)

这可能更像是一种风格选择。 STL本身倾向于首先执行,因为它提供了迭代器运行的顺序的灵活性,以及​​是否执行整个容器。所以这取决于你希望你的图书馆做什么。

简单的解决方案:

如果库适用于一系列元素,请使用第一个(迭代器)

如果库在容器上工作,请使用第二个(容器)

答案 2 :(得分:1)

在我看来,第一个,原因有几个

  1. 您可以传递受限范围,仅迭代容器的一部分

  2. 您可以使用迭代器适配器(例如std::reverse_iterator)向后移动容器

  3. 您可以对不是容器但具有迭代器行为的事物进行操作,例如指向C数组的指针或std::ostream_iterator

  4. 更好地与标准库交互 - 许多函数返回迭代器,而迭代器又可以用作函数的参数。

  5. 当然,缺点是

    my_func(v.begin(), v.end(), u.begin(), u.end());
    

    比调用

    更丑陋
    my_func(v, u);
    

    但我认为这只是我们在无概念C ++世界中必须要考虑的事情。

答案 3 :(得分:1)

如果可以,绝对可以使用迭代器。

使用迭代器形式允许传递反向迭代器(rbegin()和rend())。它允许传递有限的部分,也可以允许意外但漂亮的应用程序,如流迭代器。如果你需要容器​​功能,例如插入/ push_back / other的能力,传递直接容器可能是明智的。

当然没有什么可以阻止你提供第二个重载函数,它接受容器类型,然后使用begin / end调用迭代器版本,如果适用的话允许更简洁的使用。