strncpy相当于std :: copy

par*_*mar 3 c++ stl

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)

问题:

  1. 我在这里重新发明轮子吗?有没有一个stl算法来做我想要的.
  2. 我的safecopy有任何不足之处,它是否适用于std :: copy的所有工作?

Ker*_* SB 5

让我将评论推广到答案,所以我有更多的空间.

首先,您的实施看起来不错.

现在,为什么这不是标准?(新标准补充说std::copy_n,但这也有所不同.*)

想一想:strncopy这不是一个"好"的想法; 这不是一个糟糕的主意.由于C没有任何动态数据结构,因此长度检查版本是您可以做的最好的.

但在C++中不能很好地适应动态容器的总体思路:你不太会覆盖一些元素,而是创建所有元素,您可以通过做std::copystd::inserter.strncpy是一个需要你预分配目标数据结构的拐杖,但在C++中我们可以做得比这更好.使用动态容器,迭代器和插入器,我们可以复制任何内容而无需担心分配.

换句话说,任何抽象的算法,你可能会想到应该有获得迭代器和迭代器范围的更好的,更具体的方法(认为删除/擦除); 很少情况下,算法的最终目标是仅产生受某些其他目的地范围约束的输出范围.

总结:是的,你可以这样做,但你可以做得更好.

*)虽然可以使用源和目标大小的copy_n加号min来创建有界副本.

  • @parapurarajkumar:通常你只会使用`std :: array`,如果你希望你的整个数组都有意义,在这种情况下你不想复制除了匹配范围之外的任何东西.如果你有变量范围,你不会使用`std :: array`,而是更喜欢动态容器.C++使你无需携带不必要的残缺和魔术`MAX_SIZE`占位符. (2认同)