std::copy(buffer_, buffer_ + size_ + 1, new_buffer)
如果我不想使用副本,这是正确的等价物吗?
for (int i = 0; i < (size_ + 1); i++){
new_buffer[i] = buffer[i];
}
还是完全错了?还是一个人呢?或其他什么?
谢谢!
答案 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
进行索引。负面指数是合法的,但我不认为你打算在这里允许它们。