STL提供了std :: copy,但是对于具有固定大小的输出容器使用它是很棘手的,因为输出迭代器没有边界检查
所以我发明了自己的东西,如下所示
template<class InputIterator , class OutputIterator>
void safecopy( InputIterator srcStart , InputIterator srcEnd ,
OutputIterator destStart , OutputIterator destEnd )
{
while ( srcStart != srcEnd && destStart != destEnd )
{
*destStart = *srcStart;
++srcStart;
++destStart;
}
}
int main()
{
std::istream_iterator<char> begin(std::cin), end;
char buffer[3];
safecopy( begin, end, buffer, buffer + 3 );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题:
让我将评论推广到答案,所以我有更多的空间.
首先,您的实施看起来不错.
现在,为什么这不是标准?(新标准补充说std::copy_n,但这也有所不同.*)
想一想:strncopy这不是一个"好"的想法; 这不是一个糟糕的主意.由于C没有任何动态数据结构,因此长度检查版本是您可以做的最好的.
但在C++中不能很好地适应动态容器的总体思路:你不太会覆盖一些元素,而是创建所有元素,您可以通过做std::copy加std::inserter.strncpy是一个需要你预分配目标数据结构的拐杖,但在C++中我们可以做得比这更好.使用动态容器,迭代器和插入器,我们可以复制任何内容而无需担心分配.
换句话说,任何抽象的算法,你可能会想到应该有获得迭代器和迭代器范围的更好的,更具体的方法(认为删除/擦除); 很少情况下,算法的最终目标是仅产生受某些其他目的地范围约束的输出范围.
总结:是的,你可以这样做,但你可以做得更好.
*)虽然可以使用源和目标大小的copy_n加号min来创建有界副本.