Qt:QMap中矢量的迭代器

时间:2014-02-27 15:02:53

标签: c++ qt vector iterator 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>> >吗?

2 个答案:

答案 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,这在这方面提供了更好的界面。