我不想使用 std::copy...他的这个正确的循环替代方案?
i don't want to use std::copy...his this the right for-loop alternative?
我试图不使用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_buffer
是any输出迭代器。只有当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
来索引。
相关文章:
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- C++ 循环屏障中的倒计时使用原子变量出错[请无锁的解决方案]
- 只有一个正确解决方案的无限循环
- 高速解决方案以循环浏览不同变量的所有组合,并使用启动步骤停止方案(C )
- 如果找不到解决方案,我如何留下递归循环,而不会打印任何东西
- 循环访问相同数据的优雅替代方案
- 平均循环值(特别是 HSL 配色方案中的色调)
- 寻找此循环的更快特征替代方案
- 卡死胡同-无休止的循环,没有解决方案
- 对于同一循环的这两个连续组,是否有更有效的解决方案
- 循环查找解决方案
- 简单的尝试 c++ 的捕获循环解决方案
- 用于交替 for 循环的 C++ 通用解决方案
- 在c++中,任何更好的方法都可以做到这一点,计算谜题的解决方案(49!结果,49个循环)
- 一个while循环的重要解决方案
- 如果-否则循环以找到解决方案
- 在一个文件夹(及其子文件夹)的所有文件上循环:最简单的解决方案
- 嵌套for循环解决方案
- c++中嵌套for循环的替代方案是什么?
- 我不想使用 std::copy...他的这个正确的循环替代方案?