Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从圆形数组中提取一个数组_C++_Arrays_Queue_Buffer - Fatal编程技术网

C++ 从圆形数组中提取一个数组

C++ 从圆形数组中提取一个数组,c++,arrays,queue,buffer,C++,Arrays,Queue,Buffer,所以,我的目标是在缓冲区中捕获数据。 我需要速度,我只需要一个固定的大小,所以我认为圆形阵列是最好的 但我想做的是在每一步: 首先,用刚到达的最新信息覆盖数组中的最新信息 接下来,使用从最旧到最新的all数组 重复 我很难理解C++中如何处理第二步,而效率很高。或者,除了圆形阵列以外的其他东西会更好?欢迎提出任何建议或观点 要获得更多图形: for step in steps: (current writing position = 2) current buffer = [

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

但我想做的是在每一步:

  • 首先,用刚到达的最新信息覆盖数组中的最新信息
  • 接下来,使用从最旧到最新的all数组
  • 重复
我很难理解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)
(我使用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)