CGAL文档中的第1.3.2节here主张使用OutputIterator
返回convex_hull_2()
的结果,因为在调用时容器为空,因此我们无法通过{{1} }。
在一个示例非CGAL程序中,我试图简单地将空容器的地址作为输出参数传递给一个函数(它将一些元素添加到容器中)并且我能够在调用者中访问这些元素。 / p>
所以我想知道容器的传递地址总是是否等同于将result.begin()
传递给该容器?如果是这样,那么有没有其他特定的理由在CGAL函数中引入OutputIterator
?
答案 0 :(得分:4)
OutputIterator
的优点是您可以制作可以使用任何类型标准容器的模板。与传递地址或引用相比,另一个优点是调用者可以选择使用std::front_inserter
或std::back_inserter
,具体取决于他们想要的顺序,以及更快/可能的选择容器。调用者甚至可以使用自定义迭代器扩展函数的功能。
以下是将OutputIterator
传递给空容器的方法:
template<class Iter>
void foo(Iter it) {}
std::list<int> bar;
foo(std::inserter(bar, bar.begin()));
只要返回的迭代器未被解除引用,就可以在空容器上调用begin()
。
不能简单地传递开始的原因是因为begin不是OutputIterator
。