私は次のようなクラスを持っています:
typedef std::list<char*> PtrList;
class Foo
{
public:
void DoStuff();
private:
PtrList m_list;
PtrList::iterator m_it;
};
この関数DoStuff()は基本的に、要素を追加m_listまたは消去し、その中の特別な要素へのイテレータを見つけて、に格納しm_itます。m_itの各値は、以降のすべての呼び出しで使用されることに注意してくださいDoStuff()。
だから問題は何ですか?プロファイリングが、からnew呼び出されたためにオペレーターが呼び出されすぎていることを
示していることを除いて、すべてが機能します。list::push_back()DoStuff()
パフォーマンスを向上させるためm_listに、の初期化でメモリを事前に割り当てたいとFoo思いstd::vectorます。問題は、これにより次のような新しい問題が発生することです。
- 効率が悪く
insert、erase要素があります。 m_itベクトルが1つの呼び出しからDoStuff()次の呼び出しに変更されるとすぐに無効になります。編集: Alan Stokesは、この問題を解決するために、イテレータの代わりにインデックスを使用することを提案しました。
私の解決策:私が考えることができる最も簡単な解決策は、リンクリスト機能も備えたオブジェクトのプールを実装することです。このようにして、リンクリストを取得し、そのためのメモリを事前に割り当てることができます。
私は何かが足りないのですか、それとも本当に最も簡単な解決策ですか?「車輪の再発明」をしたくはありません。代わりに、標準ソリューションが存在する場合はそれを使用します。
任意の考え、回避策、または啓発的なコメントをいただければ幸いです。