我正在使用Qt和OpenCV,我想创建一个带std::vector <cv::Rect_<int>>
的迭代器来访问所有cv :: Rect_。
此向量是QMap < int, std::vector <cv::Rect_<int>> > _facesframe;
所以这就是我试图访问这些向量的方式:
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";
}
}
但由于迭代器不兼容,程序在if...
行崩溃。
有人知道如何联系到cv::Rect_<int>
的所有QMap < int, std::vector <cv::Rect_<int>> >
吗?
答案 0 :(得分:1)
这是因为您正在将迭代器与不同的向量进行比较。
const T QMap::value(const Key & key, const T & defaultValue = T()) const
Vector按值返回,因此会复制。
你应该使用
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份副本的效率较低):
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";
}
答案 1 :(得分:1)
QMap::value
返回值。这意味着它返回了向量的副本,当然你的迭代器指向不同的向量(不同的副本) )。将其更改为使用非const版本operator[]
(因为的const
版本也按值返回)。或者只使用std::map
,这在这方面提供了更好的界面。