Qt :itérateur d'un vecteur dans un QMap
Question
Je travaille avec Qt et OpenCV et j'aimerais créer un itérateur avec std::vector <cv::Rect_<int>>
pour avoir accès à tous les cv::Rect_.
Ce vecteur fait partie d'un QMap < int, std::vector <cv::Rect_<int>> > _facesframe;
Voici donc comment j'essaie d'avoir accès à ces vecteurs :
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";
}
}
Mais le programme plante à la ligne if...
à cause d'un itérateur incompatible.
Est-ce que quelqu'un sait comment atteindre tous cv::Rect_<int>
d'un QMap < int, std::vector <cv::Rect_<int>> >
s'il te plaît?
La solution
C'est parce que vous comparez les itérateurs à différents vecteurs.
const T QMap::value(const Key & key, const T & defaultValue = T()) const
Le vecteur est renvoyé par valeur, celui-ci est donc copié.
Tu devrais utiliser
T & QMap::operator[](const Key & key)
pour corriger ça :
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";
}
}
ou (moins efficace car 1 copie est réalisée) :
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";
}
Autres conseils
QMap::value
revient par valeur. Ce qui signifie qu'il renvoie un copie du vecteur, et bien sûr votre itérateur pointe vers un vecteur différent (une copie différente).Modifiez-le pour utiliser la version non const operator[]
à la place (comme le const
version de cela aussi renvoie par valeur).Ou utilisez simplement std::map
, qui offre une bien meilleure interface à cet égard.