C++标准/事实上的STL算法包装器

8

是否有标准/事实标准(boost)包装器可以与定义 begin 和 end 的容器一起使用标准算法。让我用代码说明我的意思:

// instead of specifying begin and end
std::copy(vector.begin(), vector.end(), output);
// write as
xxx::copy(vector, output);

我知道这可以很容易地编写,但我特别寻找普遍存在的东西。 谢谢。


1
确实是个很好的问题。我一直觉得基于迭代器的算法思路非常混乱... std::copy(input.begin(), input.end(), std::back_inserter(output)); 看起来真的让人很不舒服... 不幸的是,每当需要修改底层容器的结构(添加/删除元素)时,Boost.Range 就无法胜任了 :/ - Matthieu M.
4个回答

8

Boost Range库有一个扩展叫做RangeEx,其中包含所有STL算法的范围包装器以及一些新的算法。

它最近已被纳入Boost中,因此尚未包含在当前的“官方”版本(1.41)中。在此之前,您可以从Boost Vault 下载最新版本

不知道这是否会成为C ++标准的一部分,但它在Boost中的存在意味着它将成为事实上的标准。


1
FYI,RangeEx已经在Boost Range 1.43.0中集成。 - sstock

2
下一个标准(希望如此!)将修正这一点。与此同时,请查看Boost.Range及其各种用途,尽管我不知道是否有与标准算法的接口。

TR1不包括范围设施。C++0x的维基百科页面列出了一些关于范围语义的条目,但它们是指在C++0x中新增的基于范围的for循环。据我所知,在新标准中,标准算法没有被修改--尽管我可能错了.... - Billy ONeal
@unknown:不,TR1并不是一个严格的新标准,它只是一堆建议。我说的是C++0x(虽然这确实在维基百科文章中缺失 - 但它曾经计划过。不确定它是否被纳入了最终草案)。 - Konrad Rudolph
这是Stroustrup的“概念”提案的一部分,但它并未包含在C++0x中。虽然库的更改非常有用,但必须权衡概念作为语言特性所带来的复杂性。 - Jason Orendorff
@Jason:嗯,遗憾。但是实际上这并不需要概念,因为范围只是两个迭代器的持有者,所以我不明白为什么它会随着概念一起被删除。 - Konrad Rudolph

1

我只在那些基于boost::range库的算法中见过类似的情况,但即使是这些算法也不会真正修改标准算法,比如std::copystd::remove_if -- 相关的算法需要编写以利用这样的范围包装器。

例如,请参阅Boost String Algorithms库。


0

我会添加自己的发现:Adobe源代码库(范围从boost超越了算法部分)ASL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接