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

i don't want to use std::copy...his this the right for-loop alternative?

本文关键字:循环 方案 std copy 我不想      更新时间:2023-10-16

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

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

如果我不想使用copy,这是正确的等效吗?

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

还是完全错了?还是差一个?还是别的什么?

谢谢!

好了,这两个代码示例将给出相同的结果。

但是,如果您使用size_ + 1,您将有一个off-by- 1错误。只有size_是正确的值,因为它已经指向最后一个元素后面的一个。

不清楚你写的东西是否有效。copy版本工作,如果buffer_any随机访问和new_bufferany输出迭代器。只有当buffer_是指针时,您的手动版本才有效。

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

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

我将这样做,因为使用通用迭代器更容易重用(很像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作为变量名在这里有点令人困惑,顺便说一句。这意味着buffer + size将比buffer的末尾高一点,因为您开始将数组的元素标记为0,但开始将它们计数为1,因此最后一个元素通常位于索引size - 1处。

同样,如果你打算使用for循环和索引操作符,你应该使用unsigned int来索引。