Qt:o iterador de vetor em um QMap
Pergunta
Eu estou trabalhando com Qt e OpenCV e eu gostaria de criar um iterador com std::vector <cv::Rect_<int>>
para ter acesso a todos os cv::Rect_.
Este vetor é parte de um QMap < int, std::vector <cv::Rect_<int>> > _facesframe;
É assim que eu estou tentando ter acesso a estes vetores:
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";
}
}
Mas o programa falha na linha de if...
devido a uma incompatibilidade do iterador.
Alguém sabe como chegar a todos os cv::Rect_<int>
de um QMap < int, std::vector <cv::Rect_<int>> >
por favor?
Solução
Isso é porque você está comparando os iteradores para diferentes vetores.
const T QMap::value(const Key & key, const T & defaultValue = T()) const
Vetor é retornado por valor, portanto, este é copiado.
Você deve usar
T & QMap::operator[](const Key & key)
para corrigir este problema:
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 (menos eficiente porque, de 1 de cópia está sendo feita):
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";
}
Outras dicas
QMap::value
retorno o valor. O que significa que está retornando de um cópia do vetor, e, claro, o iterador aponta para um vetor diferente (uma cópia).Alterá-lo para uso não-const versão operator[]
em vez disso (como o const
versão de que também retorna por valor).Ou apenas usar std::map
, que oferece uma melhor interface em relação a isso.