Qt:итератор вектора в QMap
Вопрос
Я работаю с 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>> >
пожалуйста?
Решение
Это происходит потому, что вы сравниваете итераторы с разными векторами.
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 копии):
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
возвращается по ценность. Что означает, что он возвращает копировать из вектора, и, конечно, ваш итератор указывает на другой вектор (другую копию).Измените его, чтобы использовать неконстантную версию operator[]
вместо этого (в качестве const
версия этого тоже возвращает по значению).Или просто использовать std::map
, который предлагает гораздо лучший интерфейс в этом отношении.