【发布时间】:2012-08-01 21:00:30
【问题描述】:
在 C++11 中,STL 现在有一个 std::iota 函数(参见 reference)。然而,与std::fill_n、std::generate_n 相比,没有std::iota_n。什么是一个好的实现呢?直接循环(备选方案 1)或使用简单 lambda 表达式(备选方案 2)对std::generate_n 的委托?
备选方案 1)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
while (n--)
*first++ = value++;
return first;
}
备选方案 2)
template<class OutputIterator, class Size, class T>
OutputIterator iota_n(OutputIterator first, Size n, T value)
{
return std::generate_n(first, n, [&](){ return value++; });
}
两种替代方案是否会通过优化编译器生成等效代码?
更新:结合了@Marc Mutz 的优点,在其目标点也返回了迭代器。这也是 std::generate_n 在 C++11 中与 C++98 相比的更新方式。
【问题讨论】:
-
我认为这个问题的重点是一些过于具体的东西,而不是更笼统的东西:不同的循环结构。
-
何不试试,对比一下汇编器?
-
@KerrekSB 在挖掘装配输出方面并不是什么专家。我很想听听具有这种专业知识的人的意见,如果带有 lambda 的 STL oneliners 通常会被优化为直循环。如果是这样的话,这将是一个更大的动力来编写更多关于 STL 算法的变体,而不是努力思考复杂的循环。
-
如果你只想使用随机访问迭代器,你可以简单地使用
std::iota(start, start + n, value);。另外,我会将i != n更改为i < n作为第一个替代方案。
标签: c++ algorithm stl c++11 iota