【发布时间】:2013-07-15 20:36:40
【问题描述】:
当我想知道如何实现 C++ 标准库中的算法时,我总是查看 http://en.cppreference.com/w/cpp/algorithm,这是一个很好的来源。但有时我不理解一些实现细节,我需要一些解释为什么会以这种特定方式完成某些事情。比如在std::copy_n的实现中,为什么第一个赋值是在循环之外进行的,所以循环以1开始?
template< class InputIt, class Size, class OutputIt>
OutputIt copy_n(InputIt first, Size count, OutputIt result)
{
if (count > 0) {
*result++ = *first;
for (Size i = 1; i < count; ++i) {
*result++ = *++first;
}
}
return result;
}
另外:您知道解释可能的算法实现的网站吗?
【问题讨论】:
-
这个可能的实现是基于found in libc++
-
另外,一般注意事项:仅当功能正确但通常远非最佳时,才提供 cppreference 的可能实现,实现可以用几行代码编写:std::shuffle 正在推动它, std::stable_sort 不会发生。如果您对真正发生的事情感兴趣(例如,当
std::copy编译为std::memmove时),请查看 C++ 标准库(例如 LLVM libc++、GNU libstdc++ 或 what-have-you)中的实际实现 -
@Cubbi:在我问这个问题之前,我查看了 MSVC 的实现。我必须梳理大量的函数调用才能达到实际的实现。因此,我喜欢站点 cppreference 的“仅几行代码”,正如 copy_n 示例所示,这些代码仍然正确。算法实现提供了灵感,如何编写我的一个通用的、基于迭代器的算法。我要感谢您对这个问题的宝贵意见和给出的答案,我认为是您,如何指出 copy_n 的幼稚实现的错误。
标签: c++ stl-algorithm