QT:Qmapのベクトルのイテレータ
質問
QTとOpenCVを使って作業しています。
このベクトルはstd::vector <cv::Rect_<int>>
だから私がこれらのベクトルにアクセスしようとしている方法です:
foreach (unsigned int frame , _imageGItem->_faceSampler._facesframe.keys() )
{
std::vector <cv::Rect_<int>>::const_iterator it = _imageGItem->_faceSampler._facesframe.value(frame).begin();
if( it != _imageGItem->_faceSampler._facesframe.value(frame).end())
{
qDebug()<<"here";
}
}
.
しかし、プログラムは、互換性のないイテレータのために、Line QMap < int, std::vector <cv::Rect_<int>> > _facesframe;
でクラッシュします。
if...
のすべてのcv::Rect_<int>
に到達する方法を知っていますか?
解決
これは、イテレータをさまざまなベクトルに比較しているためです。
const T QMap::value(const Key & key, const T & defaultValue = T()) const
.
ベクトルは値で返されるため、コピーされます。
を使うべきですT & QMap::operator[](const Key & key)
.
これを修正する:
foreach (unsigned int frame , _imageGItem->_faceSampler._facesframe.keys() )
{
std::vector <cv::Rect_<int>>::const_iterator it =
_imageGItem->_faceSampler._facesframe[frame].begin();
if( it != _imageGItem->_faceSampler._facesframe[frame].end())
{
qDebug()<<"here";
}
}
.
または(1コピーの効率的なBACAUSEが作られていない):
std::vector <cv::Rect_<int>> v = // this will copy
_imageGItem->_faceSampler._facesframe.value(frame);
std::vector <cv::Rect_<int>>::const_iterator it = v.begin();
if( it != v.end())
{
qDebug()<<"here";
}
. 他のヒント
QMap::value
は値で戻ります。は、ベクトルの copy を返すことを意味し、もちろん、イテレータは別のベクトル(別のコピー)を指します。代わりに(そののoperator[]
バージョンとしてが値別に戻る)、非const version grefodicetagcodeを使用するように変更します。またはconst
を使用するだけで、この点に関してはるかに優れたインタフェースを提供します。
所属していません StackOverflow