从圆形数组中取一个数组

时间:2016-09-23 08:59:10

标签: c++ arrays queue buffer

所以,我的目标是在缓冲区中捕获数据。 我需要速度,我只需要一个固定的大小,所以我认为圆形阵列是最好的。

但我想做的是在每一步:

  • 首先,使用刚刚到达的最新信息覆盖数组中的最新信息
  • 接下来,使用从最旧到最新的所有数组
  • 重复

我很难看到如何在高效的同时处理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)

如果你知道更快的事情,请告诉我。

2 个答案:

答案 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容器,那么它可能不是满足速度需求的正确选择。