2012-03-01 14 views
4

シンプルで効率的な循環バッファ/キューが必要です。私はstd::vectorを使用している場合は、私がこれを行う必要があります:効率的な循環リスト

if (v.size() >= limit) { 
    std::vector<int> it = v.begin(); 
    v.insert(it, data); 
    v.erase(it+1); 
} 

を任意の簡単な解決策はありますか?

+0

私はあなたの質問を理解していない...あなたは* STDを使用して循環リストを実装したいですか? – m0skit0

+0

番号。これはstd :: vectorを使った私の実装です。しかしそれは良い考えではありません。挿入してから削除してサイズを固定してください。 – mahmood

+2

http://www.boost.org/doc/libs/1_49_0/libs/circular_buffer/doc/circular_buffer.htmlおそらく? – Bart

答えて

7

バッファのサイズを維持して、古いアイテムを上書きします。時間の経過とともに古いものを上書きするだけです。 nItems <が制限されている場合に対処する必要がある場合は、これを処理する必要があります。これは、モジュロを使用して固定サイズのバッファに挿入する単純な例です。

std::vector<int> data(10); 

for (int i = 0 ; i < 100 ; ++i) 
{ 
    data[i%10] = i; 
} 

for (std::vector<int>::const_iterator it = data.begin() ; it !=data.end(); ++it) 
{ 
    std::cout << *it << std::endl; 
} 

この挿入方法は、最後の10個の要素をバッファに保持します。

2

std::listは、std::vectorよりもリストを作成する方が簡単です。 std::queueもあります。

それはあなたが円形キューを実装したが、円形のリストを実装する方法についての質問をするベクトルを使用していることも面白いです。マップを使わないのはなぜですか?

+0

'std :: queue :: push()'も最後にプッシュします – mahmood

+0

okマップは良いです。 – mahmood

+0

std :: listを使って、サイズを調整するには 'push_front'と' pop_back'を使わなければなりません。右? – mahmood

0

std :: dequeを試してください。インタフェースはstd :: vectorを使うのと似ていますが、最初と最後に挿入と削除が効率的です。あなたがstd::arrayを使用しなければならない固定サイズの代替のためのc++11

0

:ベクトル*:

const unsigned int BUFFER_SIZE = 10; 
std::array<int, BUFFER_SIZE> buffer; // The buffer size is fixed at compile time. 
for (i = 0; i < 100; ++i) { 
    buffer[i%10] = i; 
} 
関連する問題