2014-02-27 86 views
1

我正在使用Qt和OpenCV,我想創建一個迭代器,使用std::vector <cv::Rect_<int>>可以訪問所有cv :: Rect_。
該載體的QMap < int, std::vector <cv::Rect_<int>> > _facesframe;Qt:QMap中向量的迭代器

一部分,所以這是我想有訪問這些載體:

   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...因爲不兼容的迭代器的程序崩潰。

有人知道如何達到QMap < int, std::vector <cv::Rect_<int>> >的所有cv::Rect_<int>嗎?

回答

1

這是因爲您正在將迭代器與不同的向量進行比較。

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份低效率bacause):

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"; 
    } 
+0

謝謝你提出的兩種選擇。我用你第二個選項。 – Jeanstackamort

1

QMap::value通過價值回報。這意味着它將返回一個拷貝的向量,當然你的迭代器指向一個不同的向量(一個不同的拷貝)。將其更改爲使用非const版本operator[]代替(因爲const版本的按值返回)。或者只是使用std::map,這在這方面提供了一個更好的接口。

+0

謝謝你也說@piotruś你是對的'operator []'也可以。 – Jeanstackamort

+0

Angew首先是關於運營商[],我是第一個關於第二個選項,並首先提供答案和解釋一般 – 4pie0