gpt4 book ai didi

c++ - 为什么总是在 std::for_each 中指定迭代器?

转载 作者:太空狗 更新时间:2023-10-29 23:47:26 25 4
gpt4 key购买 nike

据我所知,迭代 STL 集合的惯用语看起来像这样:

int a[] = { 1,2,3 };
std::vector<int> v(a, a+3);

std::for_each(a.begin(), a.end(), some_function);

如果我只想处理集合的某个范围,或者做一些更有创意的事情,那么指定第一个和最后一个迭代器很有用,但大多数时候,我怀疑我们实际上是想处理整个集合.所以,我想知道为什么人们在那种情况下费心指定迭代器(因为它们总是相同的),而不是仅仅使用这些方面的便利函数:

namespace easy
{
template <class T, class F>
F for_each(T& collection, F function)
{
std::for_each(collection.begin(), collection.end(), function);
return function;
}
}

(当然,这可能是惯用的做事方式,我从来没有注意到!不过我是 C++ 的新手。)

最佳答案

我绝对是 STL 的狂热爱好者。但我不记得实际上曾经使用过 for_each

成语是

for ( container::iterator it = coll.begin(); it != coll.end(); ++ it )

C++11 引入了 sugar 来减少它

for ( auto elem : coll )

这类似于您的便利函数,但使用免费(非成员)std::beginstd::end 函数,允许与对象兼容不是标准容器。

此外,查找它(我还没有开始玩这个,因为它还没有在 GCC 中),它似乎限制程序员访问范围的元素,而不是迭代器。


至于使用容器来引用其整个范围,最好保持允许子范围的灵 active 。另一种解决方案是为 迭代器引入一个习惯用法,{ begin, end } 。有一些争论,我希望 C++11 包含这样的特性

begin( make_pair( begin_, end_ ) ) // == begin_,
end( make_pair( begin_, end_ ) ) // == end_,
for ( auto elem : make_pair( begin_, end_ ) ) // iterates over [ begin_, end )

但在阅读标准后,pair 似乎缺少此功能。

但是,您可以创建自己的这样的,以获得灵活的基于范围的for:

template< typename iter >
struct range_type {
iter first, last;

// use friends because Standard specifies these should be found by ADL:
friend iter begin( range_type const &r ) { return r.first; }
friend iter end( range_type const &r ) { return r.last; }
};

template< typename iter >
range_type< iter > range( iter first, iter last )
{ return range_type< iter >{ first, last }; }

// usage:
for ( auto elem : range( begin_, end_ ) ) // iterates over [ begin_, end )

关于c++ - 为什么总是在 std::for_each 中指定迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com