2012-02-27 14 views
0

私は、データ構造とproblemを持つC++ 03でプロジェクトを持っている:私は継続的にpop_front-一backに持っていても、リストの代わりにベクトルを使用しています。しかし、今のところ、あまりにも多くのコードを書き直す必要があるので、これは大丈夫です。ポップ・プッシュのstd ::ベクトルからの要素と再利用要素が

私のアプローチは、最後のframe_sizeポイントのバッファを常に更新しています。だから各フレーム私は前面にポップして戻ってする必要があります。 (mayebeは、このアプローチのために名前がありますか?)

はので、私はこのコードを使用:私はオブジェクトプールのためのいくつかのすぐに使用できるコードを持っていると私は思っ

Point apoint; // allocate new point 
apoint.x = xx; 
apoint.y = yy; 

int size = points.size() 
if (size > frame_size) { 
    this->points.erase(points.begin()); // pop_front 
} 
this->points.push_back(apoint); 

を:それはないです素晴らしい最適化が、私はプールにフロントを格納することができますので、私はポイントの割り当て時間を得ることができます。

OKこれは意味をなさないので、便利ではおそらくありませんが、私はちょうど教育好奇心に頼む:どのように私はそれを行うことができますか?

は、どのように私はそれをを再利用するためのベクターの消去要素のメモリを保存することができますか?この質問は理にかなっていますか?そうでない場合、なぜですか?

...消去が消去ベクトルを返さないので、それは返す:

ある関数呼び出しによって消去最後の要素を踏襲要素 の新しい場所を指すランダムアクセスイテレータ、 操作が シーケンス内の最後の要素を消去した場合、ベクトルの終了。

// don't do this on an empty vector 
assert (points.size() > 0); 

// rotate elements in the vector, erasing the first element 
// and duplicating the last one 
copy (points.begin()+1, points.end(), points.begin()); 

// overwrite the last element with your new data 
points.back().x = xx; 
points.back().y = yy; 

EDIT:マイクとして、私はあなたが何をしたいのか理解することはわからないんだけど、これはあなたが一時的Pointインスタンスを作成せずに、書いたものにfunctionnally同等でなければなりません

+2

'pop_front'を連続して' list'を使いたくないのなら、なぜ 'std :: deque'ではないのですか? –

+0

問題は、私はstd :: vectorを使うユーティリティがたくさんあるので、ユーティリティやリポジトリを開き、リストやデキューのためにベクトルを取るすべてをテンプレート(または書き換え)する必要があります。 – nkint

+0

ポイントの重い重量の作成ですか?あなたはベクトルにオブジェクトへのポインタではなくオブジェクトを格納しています。オブジェクトをプールに保存する場合は、オブジェクトではなくポインタとしてオブジェクトを格納することをお勧めします。 – Jagannath

答えて

2

私はオブジェクトプール用にすぐに使用できるコードを用意しています...どうすればいいですか?ベクターを用いて

、あなたがすることはできません。ベクトルは要素を連続した配列に格納するため、一度に1つずつ割り当てることはできず、任意のサイズのブロックでのみ割り当てられます。したがって、std::vectorのアロケータとしてオブジェクトプールを使用することはできません。

どのように私はそれを再利用するためのベクトルの消去された要素のメモリを格納することができますか?この質問は理にかなっていますか?そうでない場合、なぜですか?

ベクトルはすでにそれを行います。 eraseへのあなたの呼び出しは、最初の要素が空いているスペースにすべての要素を移動し、最後に空のスペースを残して新しい要素を押し込みます。

ベクトルを使用している限り、最初の要素を消去するときにすべての要素を移動することは避けられません。それがあまりにも非効率な場合は、代わりにdeque(または場合によってはlist)を使用してください。

1

Seymour氏はこのコメントや問題で提案されたアプローチも、新しいメモリ割り当てを引き起こさないとコメントしています。

+0

最後の2つのステートメントはif条件の中にあるはずですか? – Jagannath

+0

if条件を削除するだけで、@nkintが欲しいのです。 – Jagannath

+0

@ Jagannathの両方の方法が同等であるべきですが、あなたが正しいです:あなたはよりエレガントでコンパクトです。 – Francesco

関連する問題