質問

QTとOpenCVを使って作業しています。 このベクトルはstd::vector <cv::Rect_<int>>

の一部です。

だから私がこれらのベクトルにアクセスしようとしている方法です:

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

                }
.

しかし、プログラムは、互換性のないイテレータのために、Line QMap < int, std::vector <cv::Rect_<int>> > _facesframe;でクラッシュします。

if...のすべてのcv::Rect_<int>に到達する方法を知っていますか?

役に立ちましたか?

解決

これは、イテレータをさまざまなベクトルに比較しているためです。

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";
  }
.

他のヒント

QMap::value値で戻ります。は、ベクトルの copy を返すことを意味し、もちろん、イテレータは別のベクトル(別のコピー)を指します。代わりに(そのoperator[]バージョンとしてが値別に戻る)、非const version grefodicetagcodeを使用するように変更します。またはconstを使用するだけで、この点に関してはるかに優れたインタフェースを提供します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top