كيو تي:مكرر المتجه في QMap
سؤال
أنا أعمل مع Qt وOpenCV وأرغب في إنشاء مكرر به std::vector <cv::Rect_<int>>
للوصول إلى كافة السيرة الذاتية::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>> >
لو سمحت؟
المحلول
هذا لأنك تقارن التكرارات بنواقل مختلفة.
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";
}
}
أو (أقل كفاءة بسبب إنشاء نسخة واحدة):
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
يعود بواسطة قيمة. مما يعني أنه يعود أ ينسخ المتجه، وبالطبع يشير المكرر إلى متجه مختلف (نسخة مختلفة).قم بتغييره لاستخدام الإصدار غير الثابت operator[]
بدلا من ذلك (كما const
نسخة من ذلك أيضًا العائد بالقيمة).أو مجرد استخدام std::map
, ، والذي يوفر واجهة أفضل بكثير في هذا الصدد.