C++ 从圆形数组中提取一个数组
所以,我的目标是在缓冲区中捕获数据。 我需要速度,我只需要一个固定的大小,所以我认为圆形阵列是最好的 但我想做的是在每一步:C++ 从圆形数组中提取一个数组,c++,arrays,queue,buffer,C++,Arrays,Queue,Buffer,所以,我的目标是在缓冲区中捕获数据。 我需要速度,我只需要一个固定的大小,所以我认为圆形阵列是最好的 但我想做的是在每一步: 首先,用刚到达的最新信息覆盖数组中的最新信息 接下来,使用从最旧到最新的all数组 重复 我很难理解C++中如何处理第二步,而效率很高。或者,除了圆形阵列以外的其他东西会更好?欢迎提出任何建议或观点 要获得更多图形: for step in steps: (current writing position = 2) current buffer = [
- 首先,用刚到达的最新信息覆盖数组中的最新信息
- 接下来,使用从最旧到最新的all数组
- 重复
for step in steps:
(current writing position = 2)
current buffer = [8, 9, 3, 4, 5, 6, 7]
new info = 10
overwrite buffer(new info)
new buffer = [8, 9, 10, 4, 5, 6, 7]
current writing position += 1 //(3)
array to use = [4, 5, 6, 7, 8, 9, 10]
function(array to use)
(我使用integer来查看缓冲区中每个信息的时间顺序)
我想的是复制最后一部分和第一部分,然后连接它们:
std::vector<int> buffer{8, 9, 10, 4, 5, 6, 7};
std::vector<int> oldest(&buffer[3],&buffer[6]);
std::vector<int> youngest(&buffer[0],&buffer[2]);
oldest.insert( oldest.end(), youngest.begin(), youngest.end() );
function(oldest)
std::向量缓冲区{8,9,10,4,5,6,7};
std::向量最早(&buffer[3],&buffer[6]);
std::向量最小值(&buffer[0],&buffer[2]);
最早的.insert(最早的.end(),最年轻的.begin(),最年轻的.end());
功能(最旧)
如果你知道一些更快的方法,请告诉我。如果你真的需要速度,你不应该复制元素,而应该使用你已经拥有的索引信息,以正确的顺序访问元素 因此,处理函数只需要一个指向数组的指针(或对std::vector的引用),知道大小和当前工作位置
// process from working pos to end of buffer
for(int i = current_pos; i < buffer_size; ++i) {
processElement(new_buffer [i]);
}
// process the remainder from begin to working pos
for(int i = 0; i < curent_pos; ++i) {
processElement(new_buffer [i]);
}
//从工作位置到缓冲区结束的过程
用于(int i=当前位置i<缓冲区大小;++i){
processElement(新的_缓冲区[i]);
}
//处理从开始到工作位置的剩余部分
对于(int i=0;i
这应该不难实现,因为您的工作位置同时标记了要处理的数据的开始和结束。这种方法将复制开销减少了n倍,其中n是使用的额外数组元素数+1 示例:具有2个额外元素的数组 注意,在这种情况下,最早的值位于左侧,已使用指向arr[0]的指针调用函数(start_pos=0) 现在,让我们插入新值10
arr == [3, 4, 5, 6, 7, 8, 9, 10, x]
start_pos += 1
使用指向第二个元素的指针调用函数(不使用旧的3)
现在添加11并增加工作位置(旧的4将不使用)
现在,数组已满
现在只需要将最后的元素复制到数组的开头(从开始位置到结束位置之后),并将工作位置设置回0
根据额外元素的数量,只需每10次、100次甚至1000次迭代一次
复制的结果将是:
arr == [6, 7, 8, 9, 10, 11, 9, 10, 11]
*
start_pos = -1 // prepare for the +1 in regular iteration.
下一个附加值(12)将覆盖*值
arr == [6, 7, 8, 9, 10, 11, 12, 10, 11]
start_pos += 1 // is 0 now
function(arr + start_pos)
当然,您需要一个变量来确定pos,以便在另一个val后面插入新元素,或者从start_pos+nElemsToProcess派生
如果你的函数()只接受STD容器,那么它可能不是正确的选择来满足速度的需要。
如果有人认为要理解我的问题,最好用C++来改变伪代码,让我知道。我会换的。我当前的代码比这更复杂。问题是我使用的是第三方库,它的函数需要all数组。我不能只处理缓冲区的一个元素。该函数采用哪种类型的数组?它从哪里获得尺寸信息?这意味着函数如何知道要处理多少个元素?内存使用是一个问题吗?如果没有,有一种简单的方法可以极大地降低复制成本。我想先把数据放入向量(缓冲区),然后用它创建张量。但是现在我想我可以像你写的那样,一个元素一个元素地填充张量。但我觉得它没有那么有效。关于记忆,没有真正的问题。速度是主要关注点。你有关于tensor类的文档(链接)吗。也许有一个快速的方法是不复制就分配多个值。谢谢!看到另一种观点真的很有趣:)但是用这种方法我们还是要在某个点上复制,对吗?您是否知道与不需要复制的循环缓冲区相比,它什么时候是值得的?顺便说一句,这就是你所说的极端复制?(以前从未听说过)我的意思是,与将所有内容复制到一个新数组相比,成本大大降低,因为您可以直接访问一行中的所有元素,而无需像使用循环数组那样进行换行)。问题是,张量是如何获取数据的(总是复制!?)。似乎是这样:/到目前为止,我还没有找到一种不同的方法。我先试试,你们先做,我会复制张量中每个元素的元素,你们只需要填写一系列的数字吗?tensor代码位于git hub上,TensorBuffer似乎允许直接访问内存。但要了解它是如何使用的,以及如何正确访问,需要深入研究。好的,我来看看。谢谢arr == [3, 4, 5, 6, 7, 8, 9, 10, 11]
start_pos += 1
function(arr + start_pos)
arr == [6, 7, 8, 9, 10, 11, 9, 10, 11]
*
start_pos = -1 // prepare for the +1 in regular iteration.
arr == [6, 7, 8, 9, 10, 11, 12, 10, 11]
start_pos += 1 // is 0 now
function(arr + start_pos)