为什么没有set_union等的便捷函数,它们采用容器类型而不是迭代器?

Cat*_*kul 2 c++ boost stl set-theory set

std :: set_union及其亲属需要两对迭代器来操作集合.这很棒,因为它是最灵活的事情.然而,他们很容易就能够提供额外的便利功能,这些功能在80%的典型用途中会更加优雅.

例如:

template<typename ContainerType, typename OutputIterator>
OutputIterator set_union( const ContainerType & container1, 
                const ContainerType & container2, 
                OutputIterator      & result      )
{
    return std::set_union( container1.begin(), container1.end(), 
                           container2.begin(), container2.end(), 
                           result );
}
Run Code Online (Sandbox Code Playgroud)

会转:

std::set_union( mathStudents.begin(), mathStudents.end(), 
                physicsStudents.begin(), physicsStudents.end(), 
                students.begin() );
Run Code Online (Sandbox Code Playgroud)

成:

std::set_union( mathStudents, physicsStudents, students.begin() );
Run Code Online (Sandbox Code Playgroud)

所以:

  • 是否有这样的便利功能隐藏在我找不到的地方?

  • 如果没有,有什么理由可以将它排除在STL之外吗?

  • 在boost中是否还有更全功能的集合库?(我找不到一个)

我当然可以总是将我的实现放在某个实用程序库中,但是很难将这些内容组织起来,以便它们可以在所有项目中使用,但不会被错误地聚集在一起.

Nic*_*las 8

是否有这样的便利功能隐藏在我找不到的地方?

不在标准库中.

如果没有,有什么理由可以将它排除在STL之外吗?

算法的一般思想是它们与迭代器一起工作,而不是容器.容器可以被修改,改变和戳; 迭代器不能.因此,您知道,在执行算法后,它没有改变容器本身,只能改变容器的内容.

在boost中是否还有更全功能的集合库?

Boost.Range做到了这一点.诚然,Boost.Range做更多的莫过于此.它的算法不带"容器"; 它们采用迭代器范围,STL容器恰好满足条件.他们也有懒惰的评价,这可能对性能很好.

  • @larsmans:算法没有修改容器,迭代器也是如此.差异可能看似微妙,但那里存在差异.STL不能保证你不会编写以奇怪方式修改容器的仿函数,并将这些仿函数与算法一起使用,但这并不意味着算法被破坏,因为你可以编写这样的仿函数. (5认同)
  • "它没有改变容器本身"那么你如何解释`back_insert_iterator`是如何工作的?如果你说"它以受控的方式改变容器"或类似的话,我同意. (2认同)