1

そのようなベクトルがあるとします

std::vector<float*> vec;

これで、メモリを再利用するには、ベクトル内のポインターを削除する必要があることがわかりました。私が知っている方法は、ベクトルを反復処理して各ポインターを削除することです。これを達成するためのより速い方法があるかどうか知りたかったのです。

次のシナリオがあります

std::vector<float*> cont;

for(int i=0; i < SelectedColumns.size();i++)
{
    if(someList.count()>0)
    {
        float *a = new float(  column_cell_mapper[SelectedColumns[i]]->text().toFloat());
        cont.push_back(a);
        someclass.somemethod(*a) // Requires a reference
        ....
        ....
    }       
}
someclass.process();
4

2 に答える 2

3

を使用しstd::unique_ptrます。ベクトルが範囲外になると、それぞれfloatが破棄され、追加の作業は必要ありません。

std::vector<std::unique_ptr<float>> vec

の配列のコンテナが本当に必要な場合は、 Mark Bの回答floatを参照して代わりに使用してください。std::vector<std::vector<float>>

于 2013-09-19T15:08:34.680 に答える
3

編集:

関数呼び出しとベクターへの挿入の順序を逆にすることはできますか? 例えばこんなことができますか?

    float a = column_cell_mapper[SelectedColumns[i]]->text().toFloat();
    someclass.somemethod(a) // Requires a reference
    cont.push_back(a);

元の答え:

float をポインタで保存せず、std::vector<float>代わりに使用してください。float のような小さな単純な型の場合、余分なレベルの間接化を使用しても何も得られません。個々の浮動小数点数をポインターで格納する必要がある場合はstd::unique_ptr、C++11 またはboost::shared_ptr以前の C++ バージョンで使用できます。

フロートの配列float*を指している場合でも、そのようにしないでください。代わりに、次のようにベクトルのベクトルを使用します。

std::vector<std::vector<float> > vec;

これにより、メモリが自動的にクリーンアップされ、メモリ管理を確実にクリーンアップするために多くの時間を費やすのではなく、正しいアルゴリズムを書くことに集中できるようになります。

于 2013-09-19T15:14:04.190 に答える