我不想使用std :: copy ...他的这个正确的for-loop替代方案?

时间:2011-09-23 00:32:07

标签: c++ stl

我试图不使用STL。我的代码中有这一行:

std::copy(buffer_, buffer_ + size_ + 1, new_buffer)

如果我不想使用副本,这是正确的等价物吗?

for (int i = 0; i < (size_ + 1); i++){
    new_buffer[i] = buffer[i];
}

还是完全错了?还是一个人呢?或其他什么?

谢谢!

3 个答案:

答案 0 :(得分:5)

好的,你拥有的两个代码样本会得到相同的结果。

但是,如果您使用size_ + 1,则会出现一个一个错误。只有size_才是正确的值,因为它已经指向了最后一个元素之后的一个。

答案 1 :(得分:0)

目前尚不清楚你写的是否有效。如果copy 任何随机访问且buffer_ 任何输出迭代器,则new_buffer版本有效。只有buffer_是指针时,您的手动版才有效。

除此之外,您的手动版本在功能上是等效的。但是,如果类型是POD,那么memcpy可能会做得更好(需要检查重叠)。

请注意,您的缓冲区(编写方式)的大小为size_ + 1

答案 2 :(得分:0)

我就是这样做的,因为它更容易重用一般迭代器(很像std :: copy),因为特定于迭代器类型(随机访问)的代码不在循环:

buffer_type* begin = buffer; // EDIT: buffer_type is whatever type buffer contains.
buffer_type* end = buffer + size + 1; // EDIT: usually this would be 'buffer + size'
buffer_type* out = new_buffer; // EDIT: don't want to lose the pointer to new_buffer!

while(buffer != end) {
  *out = *begin
  ++begin; ++new_buffer;
}

如果您决定使用其他类型的迭代器,那么您就不必更改循环。

某些代码检查实用程序可能会抱怨这一点,因为他们认为您将导致访问冲突,但事实并非如此,因为上次取消引用发生在上次递增之前。

对于变量名称size的选择在这里有点令人困惑,BTW。这意味着buffer + size将超过buffer的结尾,因为您开始将数组的元素标记为零,但是您开始将它们计算在一,因此最后一个元素将位于索引{{ 1}}通常。

此外,如果您要使用for循环和索引操作符,则应使用size - 1进行索引。负面指数是合法的,但我不认为你打算在这里允许它们。