Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::copy的strncpy等价物_C++_Stl - Fatal编程技术网

C++ std::copy的strncpy等价物

C++ std::copy的strncpy等价物,c++,stl,C++,Stl,STL提供了std::copy,但是将其用于具有固定大小的输出容器是很困难的,因为在输出迭代器上没有边界检查 所以我发明了我自己的,类似下面的东西 template<class InputIterator , class OutputIterator> void safecopy( InputIterator srcStart , InputIterator srcEnd , OutputIterator destStart , Output

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;
}
模板
无效安全副本(输入计数器srcStart、输入计数器srcEnd、,
输出计算器destStart,输出计算器destEnd)
{
while(srcStart!=srcEnd&&destStart!=destEnd)
{
*destStart=*srcStart;
++srcStart;
++启动;
}
}
int main()
{
std::istream_迭代器begin(std::cin),end;
字符缓冲区[3];
安全复制(开始、结束、缓冲区、缓冲区+3);
返回0;
}
问题:

  • 我是在重新发明轮子吗?是否有一个stl算法来做我想做的事情
  • 我的safecopy有什么不足之处吗?它适用于std::copy的所有功能吗

  • 对。你又在重新发明轮子了

    例如,您可以使用
    std::copy
    作为:

    std::copy(s.begin(), s.begin() + 3 , buffer);
    
    而不是这个,

    safecopy(s.begin(), s.end() , buffer, buffer + 3);
    
    以这种方式使用
    std::copy
    的安全性不低于
    safecopy

    甚至更好的是C++11附带的:

    std::copy_n(s.begin(), 3, buffer);
    
    即使参数不是随机访问迭代器,这也会起作用


    当您使用
    std::vector
    时,您可以直接使用它的构造函数:

    std::vector<char> v(s.begin(), s.end());
    
    向量v(s.begin(),s.end());
    甚至不需要
    std::copy

    让我把我的评论升级为一个答案,这样我就有了更多的空间

    首先,您的实现看起来不错

    现在,为什么这不在标准中?(新标准增加了
    std::copy\n
    ,但这也有不同之处。*)

    这样想:
    strncopy
    不是一个真正的“好”主意;这不是个糟糕的主意。由于C没有任何动态数据结构,所以最好使用长度检查版本

    <>但是在C++中,这不适合动态容器的一般思想:你很少想要覆盖一些元素,而是创建所有元素,你通过<代码> STD::复制< /COD> +代码< > STD::插入器< /C>代码> STRNCPY 是一个拐杖,它要求你预先分配目标数据结构,但是在C++中,我们可以做得比这更好。使用动态容器、迭代器和插入器,我们可以复制任何内容,而无需担心分配问题

    换句话说,您可能想到的任何抽象算法都应该有一种更好、更具体的方法来获取迭代器和迭代器范围(想想remove/erase);很少情况下,算法的最终目标是只生成受其他目标范围约束的输出范围

    总结:是的,你可以做到,但你可能做得更好


    *)虽然可以使用源和目标大小的
    copy\n
    加上
    min
    来创建一个绑定副本。

    我将对您的实现进行一个小的调整。给它一个返回值。最终输出迭代器或指示复制的元素数的整数


    我看到的函数的主要用例是从输入流中读取固定大小的块,而您不知道它何时结束。如果它真的结束了,您需要某种方式知道它,并且您需要知道在它实际结束之前复制了多少元素。如果您知道复制了多少个元素,并且它没有达到或超过输出范围的大小,那么您就可以知道它结束了。

    您的
    缓冲区需要有4个字节宽。否则[buffer,buffer+3]将溢出缓冲区。@parapura-Hmm。。。非挥发性物质。你说得对,它是一个指针,过了一端。@Parapurajkumar:希望你不介意编辑。我认为人们没有理解你问题的实质
    std::string
    使用随机访问迭代器,这很简单。现在问题更难解决了。@parapura:
    std::copy
    与输出迭代器一起工作,而您的代码却不能——无法从输出迭代器形成一个范围。在我看来,这是一个相当大的倒退。@Benjamin谢谢你的编辑:)但是当s小于缓冲区时,这不会处理这个问题,对吗?将存在无效的迭代器access@parapurarajkumar:它也可以处理。如果源迭代器不是随机访问呢?@BenjaminLindley:这不是问题。因为这不是一开始的要求
    std::copy
    也可以与输入迭代器一起使用。@parapura:copy
    的末尾是您传递的第二个迭代器。就连C++11也引入了std::array,它是编译时固定大小的。。。不是吗?如何使用std::copy?@parapurajkumar:Pointers是随机访问迭代器,是输出迭代器。为什么
    std::array
    的使用会与其他容器有所不同?@ildjarn我的意思是。。。如果使用固定大小的std::数组作为输出计算器,则需要进行某种绑定检查,而std::copy不会剪切它?@parapurajkumar:通常,如果希望整个数组有意义,您只会使用
    std::array
    ,在这种情况下,您只想将匹配范围复制到其中。如果您有可变范围,则不会使用
    std::array
    ,而是更喜欢使用动态容器。C++使你不必携带不必要的Curfand Moist<代码> Max大小Sub/Cube占位符。@ PARAPURARAJKUMAR:另一种思想:<代码> StncPy < /Cord>只对空结束的字符串有意义。通常,它不会使输出数组处于定义良好的状态(只有null终止符可以保存您)。您可以在循环或错误检查条件中使用它。对于任意容器,这种行为不是很有用:您通常不希望在不确定状态下退出算法。在编辑的
    std中: