私は次のようなクラスを持っています:
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は、この問題を解決するために、イテレータの代わりにインデックスを使用することを提案しました。
私の解決策:私が考えることができる最も簡単な解決策は、リンクリスト機能も備えたオブジェクトのプールを実装することです。このようにして、リンクリストを取得し、そのためのメモリを事前に割り当てることができます。
私は何かが足りないのですか、それとも本当に最も簡単な解決策ですか?「車輪の再発明」をしたくはありません。代わりに、標準ソリューションが存在する場合はそれを使用します。
任意の考え、回避策、または啓発的なコメントをいただければ幸いです。