如果我正在编写一个需要接收几个容器的库函数,哪个更好?
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)
答案 0 :(得分:5)
如果你可以使用迭代器表单,那么就做。这允许调用者更灵活 - 例如,他们可以传递反向迭代器,或者一些在其他地方发送值,执行锁定或任何需要的特殊用途迭代器。如果您需要的不仅仅是迭代器访问权限 - 例如,要调用.size()
- 传递Container
可能是更好的选择。
答案 1 :(得分:2)
这可能更像是一种风格选择。 STL本身倾向于首先执行,因为它提供了迭代器运行的顺序的灵活性,以及是否执行整个容器。所以这取决于你希望你的图书馆做什么。
简单的解决方案:
如果库适用于一系列元素,请使用第一个(迭代器)
如果库在容器上工作,请使用第二个(容器)
答案 2 :(得分:1)
在我看来,第一个,原因有几个
您可以传递受限范围,仅迭代容器的一部分
您可以使用迭代器适配器(例如std::reverse_iterator
)向后移动容器
您可以对不是容器但具有迭代器行为的事物进行操作,例如指向C数组的指针或std::ostream_iterator
。
更好地与标准库交互 - 许多函数返回迭代器,而迭代器又可以用作函数的参数。
当然,缺点是
my_func(v.begin(), v.end(), u.begin(), u.end());
比调用
更丑陋my_func(v, u);
但我认为这只是我们在无概念C ++世界中必须要考虑的事情。
答案 3 :(得分:1)
如果可以,绝对可以使用迭代器。
使用迭代器形式允许传递反向迭代器(rbegin()和rend())。它允许传递有限的部分,也可以允许意外但漂亮的应用程序,如流迭代器。如果你需要容器功能,例如插入/ push_back / other的能力,传递直接容器可能是明智的。
当然没有什么可以阻止你提供第二个重载函数,它接受容器类型,然后使用begin / end调用迭代器版本,如果适用的话允许更简洁的使用。