所以,我的目标是在缓冲区中捕获数据。 我需要速度,我只需要一个固定的大小,所以我认为圆形阵列是最好的。
但我想做的是在每一步:
我很难看到如何在高效的同时处理C ++的第二步。或者除了圆形阵列之外的其他东西会更好?欢迎任何建议或观点。
要有更多图形:
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)
(我使用整数跟随,看看缓冲区中每个信息的年表)
我在想的是复制最后一部分和第一部分,然后将它们连接起来:
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)
如果你知道更快的事情,请告诉我。
答案 0 :(得分:1)
如果你真的需要速度,你不应该复制元素,而是使用你已经拥有的索引信息以正确的顺序访问元素。
因此处理函数只需要一个指向数组的指针(或对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]);
}
这不应该是难以实现的,因为您的工作位置标记了要处理的数据的开始和结束。
答案 1 :(得分:0)
这种方法减少了n-fold的复制开销,其中n是额外数组元素的数量+ 1。
示例:包含2个额外元素的数组
注意,在这种情况下,最旧的值在左侧,使用指向arr [0](start_pos = 0)的指针调用该函数
arr == [3, 4, 5, 6, 7, 8, 9, x, x]
现在,让我们插入新值10
arr == [3, 4, 5, 6, 7, 8, 9, 10, x]
start_pos += 1
使用指向第二个元素的指针调用函数(不使用旧的3)
function(arr + start_pos)
现在添加11并增加工作位置(旧的4将不会被使用)
arr == [3, 4, 5, 6, 7, 8, 9, 10, 11]
start_pos += 1
function(arr + start_pos)
现在,数组已满。
现在只需要将最后一个元素复制到数组的开头(在start_pos之后到结尾)并将working_pos设置为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容器,那么它可能不是满足速度需求的正确选择。