他们为什么不添加 iota 的运营商版本?
Why didn't they add an operator version of iota?
标准库中增加了iota模板函数,用于用递增的值序列填充迭代器范围。
template<typename ForwardIterator, typename Tp>
void
iota(ForwardIterator first, ForwardIterator last, Tp value)
{
for (; first != last; ++first)
{
*first = value;
++value;
}
}
<numeric>
中的大多数其他模板都有接受用户指定操作符的版本。有这个:
template<typename ForwardIterator, typename Tp, typename Operator>
void
iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op)
{
for (; first != last; ++first)
{
*first = value;
op(value);
}
}
如果不想(或不能)为Tp重载操作符++(),将是方便的。我发现这个版本比默认的操作符++()版本更广泛地可用。& lt;
我怀疑原因通常是以下一个或多个原因的混合:
- 没有人提交提案
- 对于这个版本来说,它被认为不够重要(这已经是巨大的,而且很晚)
- 它掉进了裂缝并被遗忘了(就像c++ 98中的
copy_if
) - 易于使用
std::generate
代替
对于lambdas,第二个版本没有节省太多,您可以使用std::generate
。
template<typename ForwardIterator, typename Tp, typename Operator>
void iota(ForwardIterator first, ForwardIterator last, Tp value, Operator op)
{
std::generate(first, last, [&value,&op](){auto v = value; op(value); return v;});
}
事实上,这使得std::iota
的现有实现非常冗余:
template<typename ForwardIterator, typename Tp>
void iota(ForwardIterator first, ForwardIterator last, Tp value)
{
std::generate(first, last, [&value](){return value++;});
}
相关文章:
- 呼叫运营商<<临时
- 两个运营商的一些奇怪的冲突<<
- 如何在 CPP 中访问家长的运营商
- 如何明确调用好友流运营商
- 私有运营商删除会触发 GCC 和 Clang 的编译时错误,但不会在 MSVC 上触发编译时错误
- 使用运营商New分配的数据结构是否有任何副作用
- "Inheriting"移动运营商?
- 朋友ostream&运营商<<无法访问私人会员
- 为什么在下面的代码返回类型中是用于运营商重载的类类型
- 范围的枚举(枚举类)关系运营商
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 对这两个分配运营商之间的不同感到困惑
- 我的班级意外加法运营商
- OpenACC - C++"新"运营商问题
- c 对运营商的一致性是新的,有多少重要
- 为什么我不能使私人运营商成为新的并使用默认实现?
- 全球取代所有新运营商
- 包装C 朋友在Cython中的非会员运营商
- 合法的交换运营商的模板实施
- 他们为什么不添加 iota 的运营商版本?