STL提供了std::,但是由于输出迭代器上没有边界检查,所以在大小固定的输出容器中使用它是很困难的。
所以我发明了我自己的,如下所示
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;
}问题:
,
发布于 2011-12-08 15:33:52
我会对你的实施做一个小小的调整。给它一个返回值。最后输出迭代器,或表示复制的元素数的整数。
我看到的函数的主要用例是从输入流中读取固定大小的块,并且不知道何时结束。如果它确实结束了,您需要某种方式来了解它,并且您需要知道在它实际结束之前复制了多少个元素。如果您知道复制了多少个元素,并且它没有满足或超过输出范围的大小,那么您就可以知道它结束了。
发布于 2011-12-08 14:57:25
是。你又在改造方向盘了!
例如,您可以将std::copy用作:
std::copy(s.begin(), s.begin() + 3 , buffer);而不是这个,
safecopy(s.begin(), s.end() , buffer, buffer + 3);以这种方式使用std::copy并不比您的safecopy安全。
或者更好的是std::copy_n,它随C++11而来:
std::copy_n(s.begin(), 3, buffer);即使参数不是随机访问迭代器,这也是可行的。
至于在使用std::vector<char>时,可以直接将其构造函数用作:
std::vector<char> v(s.begin(), s.end());甚至不需要std::copy。
https://stackoverflow.com/questions/8432864
复制相似问题