Qt:Iterator eines Vektors in einer QMap
Frage
Ich arbeite mit Qt und OpenCV und möchte damit einen Iterator erstellen std::vector <cv::Rect_<int>>
um Zugriff auf alle cv::Rect_ zu haben.
Dieser Vektor ist Teil von a QMap < int, std::vector <cv::Rect_<int>> > _facesframe;
So versuche ich, auf diese Vektoren zuzugreifen:
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";
}
}
Aber das Programm stürzt an der Leitung ab if...
wegen eines inkompatiblen Iterators.
Weiß jemand, wie man alle erreicht? cv::Rect_<int>
von einem QMap < int, std::vector <cv::Rect_<int>> >
Bitte?
Lösung
Dies liegt daran, dass Sie Iteratoren mit verschiedenen Vektoren vergleichen.
const T QMap::value(const Key & key, const T & defaultValue = T()) const
Der Vektor wird als Wert zurückgegeben, daher wird dieser kopiert.
Du solltest benutzen
T & QMap::operator[](const Key & key)
um das zu korrigieren:
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";
}
}
oder (weniger effizient, da nur 1 Kopie erstellt wird):
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";
}
Andere Tipps
QMap::value
kehrt vorbei Wert. Das heißt, es wird ein zurückgegeben Kopieren des Vektors, und natürlich zeigt Ihr Iterator auf einen anderen Vektor (eine andere Kopie).Ändern Sie es, um die nicht konstante Version zu verwenden operator[]
stattdessen (als die const
Version davon Auch Rückgabe nach Wert).Oder einfach verwenden std::map
, das in dieser Hinsicht eine viel bessere Schnittstelle bietet.