最後のn回の値を保存する必要があり、これにはベクトルを使用しています。私はこれを行うことができ、それは機能しますが、私の質問は、長期的には、ベクトルがいっぱいになり、メモリが不足する可能性があるということです。私はfloatのstlベクトルを使用しています。
より明確にするために:私は別のプロセスから時間値をプッシュバックしており、最後の5つの時間値のみが必要です。
ベクトルがいっぱいになり、最終的にメモリが不足することなく、これを効率的に行うにはどうすればよいですか?
最後のn回の値を保存する必要があり、これにはベクトルを使用しています。私はこれを行うことができ、それは機能しますが、私の質問は、長期的には、ベクトルがいっぱいになり、メモリが不足する可能性があるということです。私はfloatのstlベクトルを使用しています。
より明確にするために:私は別のプロセスから時間値をプッシュバックしており、最後の5つの時間値のみが必要です。
ベクトルがいっぱいになり、最終的にメモリが不足することなく、これを効率的に行うにはどうすればよいですか?
値をオーバーライドする循環バッファが必要であるかのように聞こえます。例としてブースト
を
見てください。
私の知る限り、キュー(または両端キュー)のメモリ使用量は循環的ではありません。代わりに、必要に応じて拡張し、場合によってはコピーして適合させます。
独自の構造を作ることをお勧めします。必要なのは、サイズ5の配列と、次の新しいアイテムで上書きされる「最後の」アイテムへのポインター(またはインデックス)だけです。新しい値が追加されるたびに、「最後の」項目が上書きされ、「最後の」ポインタが上に移動します。
last = (last+1)%5;
配列内のアイテムが5つ未満の場合は、開始を処理するための適切な方法を必ず見つけてください。最初に配列にエラー/ニュートラル値を入力するだけであれば、問題はありません。
コンテナ名を覚えていませんでした:)私はstd::queueコンテナを使用します。したがって、シーケンス内の位置を気にせずに、もう一方の端から削除できます。スレッド化について...私は仕方がないと思いますが、afaikベクトルとリストはスレッドセーフではありません。
STLキューはあなたが望むものだと思います。
新しいデータが来るたびに、データは次の場所に移動する必要があると思います。
つまり
4->5->6->7 //old data
、新しいデータが来るとき、期待される配列は
5->6->7->8 //updated
そのためのものでなければなりません。
int arr[4]={0};
int count=0;
int head=0;
void insert(int data)
{
arr[count%4]=data;
count++;
if(count > 4)
head=count%4;
printf("count=%d head=%d\n",count,head);
}
void display()
{
int i;
for(i=0;i<4;i++)
{
printf("%d->",arr[(head+i)%4]);
}
printf("\n");
}
int item_at(int i)
{
return arr[(head+i)%4];
}
int main ()
{
int opt,data;
while(1)
{
printf("0. Exit\n1. Insert\n2. Display\n3. Item at\n");
scanf("%d",&opt);
if(opt == 0)
return 0;
else if(opt == 1)
{
scanf("%d",&data);
insert(data);
}
else if(opt == 2)
{
display();
}
else if(opt == 3)
{
scanf("%d",&data);
printf("arr[%d]=%d\n",data, item_at(data));
}
}
return 0;
}