2017-04-05 3 views
0

彼らは<QList<QVector<QPointF> > m_data;QListに明確な

をクリアする

foreach (QVector<QPointF> row, m_data) 
    row.clear(); 
m_data.clear(); 

を使用する例、それはこのような構成を使用することが必要であるか、単にm_data.clear();がenounghですが?あり

Qt例page

答えて

0

無益であるだけでなく、「有害」となる可能性があります。

QList<T>::clear()は、効果的に所有しているすべてのTを破壊するため、役に立たない。~T()あなたの場合は、QList内のすべてのベクトルに対して~QVector<QPointF>()を呼び出すことになります。そして、~QVector<QPointF>()はすべてのポイントに対して~QPointF()と呼ぶでしょう。

QListとQVectorがCopy-on-Writeを使用するため、パフォーマンスに悪影響を与える可能性があります。つまり、リストをコピーすると内部データはコピーされませんが、リストの1つを変更するアクションを実行するとすぐにコピーが行われます。

したがって、m_dataがその内部データを別のQListと共有する場合、その要素のいずれかを変更すると(たとえば、そのうちの1つでQVector::clear()を呼び出して)、QList内部データのハードコピーがトリガーされます。そして、このコピーは、ちょうどm_data.clear()を呼ぶことによってそれを捨てるので完全に役に立たない。また


ことは注目に値する:

foreach (QVector<QPointF> row, m_data) 
    row.clear(); 

m_dataを変更しません。ローカル変数であるrowをクリアします。 foreachのは、のために非const 参照を使用して、コンテナのコピーを作成するので

:そして、たとえあなたがエンアップ執筆:

foreach (QVector<QPointF> &row, m_data) 
     row.clear(); 

をそれはQtのドキュメントを引用し、としては効果がありません変数で元の コンテナを変更することはできません。コピーにのみ影響しますが、これはおそらくあなたが望むものではありません。 。