C++ 我不知道';我不想使用std::copy…这是循环的正确替代方案吗?

C++ 我不知道';我不想使用std::copy…这是循环的正确替代方案吗?,c++,stl,C++,Stl,我尽量不使用STL。我的代码中有这一行: std::copy(buffer_, buffer_ + size_ + 1, new_buffer) 如果我不想使用复制,这是正确的等价物吗 for (int i = 0; i < (size_ + 1); i++){ new_buffer[i] = buffer[i]; } for(int i=0;i

我尽量不使用STL。我的代码中有这一行:

std::copy(buffer_, buffer_ + size_ + 1, new_buffer)
如果我不想使用复制,这是正确的等价物吗

for (int i = 0; i < (size_ + 1); i++){
    new_buffer[i] = buffer[i];
}
for(int i=0;i<(size_u+1);i++){
新的缓冲区[i]=缓冲区[i];
}
还是完全错了?还是差一点?还是别的什么


谢谢

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


但是,如果使用
size\uu1
,则会出现一个off by one错误。Just
size\uu
是正确的值,因为它已经指向最后一个元素后面的一个。

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


但是,如果使用
size\uu1
,则会出现一个off by one错误。Just
size\uu
是正确的值,因为它已经指向最后一个元素的后面。

不清楚您编写的内容是否有效。如果
缓冲区
是任意随机访问,而
新缓冲区
是任意输出迭代器,则
复制
版本可以工作。只有当
缓冲区
是指针时,手动版本才起作用

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


请注意,您编写缓冲区的方式具有大小
size\u1

不清楚您编写的内容是否有效。如果
缓冲区
是任意随机访问,而
新缓冲区
是任意输出迭代器,则
复制
版本可以工作。只有当
缓冲区
是指针时,手动版本才起作用

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


请注意,您编写缓冲区的方式是大小
size\u1

我就是这样做的,因为它更容易与常规迭代器(非常类似于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
的末尾,因为您开始将数组的元素标记为零,但开始将它们计数为一,因此最后一个元素通常位于索引
size-1


此外,如果要使用for循环和索引运算符,则应使用
无符号int
进行索引。负索引是合法的,但我认为您不打算在这里允许它们。

我会这样做,因为它更容易与通用迭代器(非常类似于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
的末尾,因为您开始将数组的元素标记为零,但开始将它们计数为一,因此最后一个元素通常位于索引
size-1


此外,如果要使用for循环和索引运算符,则应使用
无符号int
进行索引。负指数是合法的,但我认为你不打算在这里允许他们。

你为什么不尝试使用标准库?我真的希望在你回答@GMan的问题之前没有人回应……你为什么不尝试使用标准库?我真的希望在你回答@GMan的问题之前没有人回应……你是什么意思?在两个版本中,缓冲区的大小都是
size\uu1
。没有错误。我只是指出,他可能是指缓冲区的大小为
size\uu
。我见过一些人被“一过终点”搞糊涂了,他们(错误地)抛出了一个
+1
@Kerrek:Mystical是正确的,
I<(size_+1)
将迭代一过终点。和std::copy版本一样。我们不知道
大小是什么。也许有一个空终止的事情正在发生。问题只是这两种结构是否等效。我想我们可以警告OP检查结构,只是为了确定。@Kerrek:没错,可能是字符串。OP应该澄清这一点。你是什么意思?在两个版本中,缓冲区的大小都是
size\uu1
。没有错误。我只是指出,他可能是指缓冲区的大小为
size\uu
。我见过一些人被“一过终点”搞糊涂了,他们(错误地)抛出了一个
+1
@Kerrek:Mystical是正确的,
I<(size_+1)
将迭代一过终点。和std::copy
版本一样。我们不知道
大小是什么。也许有一个空终止的事情正在发生。问题只是这两种结构是否等效。我想我们可以警告OP检查结构,只是为了确定。@Kerrek:没错,可能是字符串。OP应该澄清这一点。