4

最後のn回の値を保存する必要があり、これにはベクトルを使用しています。私はこれを行うことができ、それは機能しますが、私の質問は、長期的には、ベクトルがいっぱいになり、メモリが不足する可能性があるということです。私はfloatのstlベクトルを使用しています。

より明確にするために:私は別のプロセスから時間値をプッシュバックしており、最後の5つの時間値のみが必要です。

ベクトルがいっぱいになり、最終的にメモリが不足することなく、これを効率的に行うにはどうすればよいですか?

4

6 に答える 6

6

値をオーバーライドする循環バッファが必要であるかのように聞こえます。例としてブースト
を 見てください。

于 2012-05-30T07:57:11.420 に答える
3

キューを使用します-その場合は完璧です。サイズが5になるまでキューをプッシュし、新しい値を追加するときは、最初にキューからポップしてから、キューにプッシュします。

編集:5つの要素すべてに直接アクセスできるようにする必要がある場合は、おそらくdequeの方が適しています。また、デフォルトのキューの実装はdequeに基づいていると思います。

于 2012-05-30T07:56:30.573 に答える
3

私の知る限り、キュー(または両端キュー)のメモリ使用量は循環的ではありません。代わりに、必要に応じて拡張し、場合によってはコピーして適合させます。

独自の構造を作ることをお勧めします。必要なのは、サイズ5の配列と、次の新しいアイテムで上書きされる「最後の」アイテムへのポインター(またはインデックス)だけです。新しい値が追加されるたびに、「最後の」項目が上書きされ、「最後の」ポインタが上に移動します。

last = (last+1)%5;

配列内のアイテムが5つ未満の場合は、開始を処理するための適切な方法を必ず見つけてください。最初に配列にエラー/ニュートラル値を入力するだけであれば、問題はありません。

于 2012-05-31T13:39:55.607 に答える
0

コンテナ名を覚えていませんでした:)私はstd::queueコンテナを使用します。したがって、シーケンス内の位置を気にせずに、もう一方の端から削除できます。スレッド化について...私は仕方がないと思いますが、afaikベクトルとリストはスレッドセーフではありません。

于 2012-05-30T08:59:40.417 に答える
0

STLキューはあなたが望むものだと思います。

于 2012-05-30T07:57:57.463 に答える
0

新しいデータが来るたびに、データは次の場所に移動する必要があると思います。
つまり
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;
}
于 2020-09-07T07:39:43.050 に答える