关于二维vector数组,迭代器clear的问题

来源:互联网  责任编辑:小易  时间:2017/1/11 17:51:12
用户提出问题:关于二维vector数组,迭代器clear的问题,具体如下:

通过互联网整理获得以下解决方法:

=================1楼=====================

matchIterator没有被初始化啊

=================2楼=====================

来个朋友帮看看啊

=================3楼=====================

matchIterator指向谁呀,楼主?

=================4楼=====================

引用 1 楼 sdghchj 的回复:
matchIterator没有被初始化啊
确实没初始化,但是为什么以下这段代码就运行没问题呢?

vector<int> a;
a.clear();
return 0;

=================5楼=====================

引用 4 楼 qq_31679731 的回复:
Quote: 引用 1 楼 sdghchj 的回复:

matchIterator没有被初始化啊
确实没初始化,但是为什么以下这段代码就运行没问题呢?

vector<int> a;
a.clear();
return 0;

这个当然没问题啊,直接掉用对象的方法。

迭带器是对指针的封装,你要掉用它指向的对象的方法,先让让它指向一个相应的对象。

=================6楼=====================

std::vector<std::vector<cv::DMatch>> vect;
vect.push_back(std::vector<cv::DMatch>());
std::vector<std::vector<cv::DMatch>>::iterator matchIterator = vect.begin();
matchIterator->clear();

=================7楼=====================

引用 4 楼 qq_31679731 的回复:
Quote: 引用 1 楼 sdghchj 的回复:

matchIterator没有被初始化啊
确实没初始化,但是为什么以下这段代码就运行没问题呢?

vector<int> a;
a.clear();
return 0;


a本身就是一个存在的对象,而你迭代器没有指向一个有效的对象

int main()
{
    std::vector<std::vector<cv::DMatch>>::iterator matchIterator = vMatch.begin();
    // vMatch是一个std::vector<std::vector<cv::DMatch>>对象
    if (matchIterator != vMatch.end())
        matchIterator->clear();
    return 0;
}

=================8楼=====================

虽然两个函数都叫 clear ,但是除了名字一样也就没有什么一样的。

不同类里的 clear 是不同的函数,他们调用的条件是不同。

而且在前一个里面,除了 clear() ,还调用了一个 operator->() 。

=================9楼=====================

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

=================10楼=====================

程序中的代码是这样的


int imgprocess::ratioTest(std::vector<std::vector<cv::DMatch> >& matches, double ratio)
{
//遍历所有匹配
for (std::vector<std::vector<cv::DMatch> >::iterator matchIterator = matches.begin();matchIterator != matches.end()-1;++matchIterator)//?
{
//如果识别两个最近邻
if (matchIterator->size()>1)
{
//检查距离比率
if ((*matchIterator)[0].distance / (*matchIterator)[1].distance>ratio)
{
matchIterator->clear();//移除匹配
}
}
else//不包括两个最近邻,则舍去该特征点
{
matchIterator->clear();
}
}
return 1;
}

进入else的->clear执行我觉得是
matchIterator是第二行数据
时,
那么当这个元素为0是不能进行->操作吗?
如果想进行->clear操作该如何改呢,谢谢大家~

=================11楼=====================

引用 8 楼 fefe82 的回复:
虽然两个函数都叫 clear ,但是除了名字一样也就没有什么一样的。

不同类里的 clear 是不同的函数,他们调用的条件是不同。

而且在前一个里面,除了 clear() ,还调用了一个 operator->() 。
为什么说.clear()还包含operator->() 呢?

=================12楼=====================

引用 11 楼 qq_31679731 的回复:
Quote: 引用 8 楼 fefe82 的回复:

虽然两个函数都叫 clear ,但是除了名字一样也就没有什么一样的。

不同类里的 clear 是不同的函数,他们调用的条件是不同。

而且在前一个里面,除了 clear() ,还调用了一个 operator->() 。
为什么说.clear()还包含operator->() 呢?

matchIterator->clear();
实际是 matchIterator.operator ->()->clear();

=================13楼=====================

引用 12 楼 fefe82 的回复:
Quote: 引用 11 楼 qq_31679731 的回复:

Quote: 引用 8 楼 fefe82 的回复:

虽然两个函数都叫 clear ,但是除了名字一样也就没有什么一样的。

不同类里的 clear 是不同的函数,他们调用的条件是不同。

而且在前一个里面,除了 clear() ,还调用了一个 operator->() 。
为什么说.clear()还包含operator->() 呢?

matchIterator->clear();
实际是 matchIterator.operator ->()->clear();
具体代码在10L,您能帮忙看下吗

=================14楼=====================

引用 7 楼 jianwen0529 的回复:
Quote: 引用 4 楼 qq_31679731 的回复:

Quote: 引用 1 楼 sdghchj 的回复:

matchIterator没有被初始化啊
确实没初始化,但是为什么以下这段代码就运行没问题呢?

vector<int> a;
a.clear();
return 0;


a本身就是一个存在的对象,而你迭代器没有指向一个有效的对象

int main()
{
    std::vector<std::vector<cv::DMatch>>::iterator matchIterator = vMatch.begin();
    // vMatch是一个std::vector<std::vector<cv::DMatch>>对象
    if (matchIterator != vMatch.end())
        matchIterator->clear();
    return 0;
}

具体代码在10L,您能帮忙看下吗

=================15楼=====================

引用 14 楼 qq_31679731 的回复:
Quote: 引用 7 楼 jianwen0529 的回复:

Quote: 引用 4 楼 qq_31679731 的回复:

Quote: 引用 1 楼 sdghchj 的回复:

matchIterator没有被初始化啊
确实没初始化,但是为什么以下这段代码就运行没问题呢?

vector<int> a;
a.clear();
return 0;


a本身就是一个存在的对象,而你迭代器没有指向一个有效的对象

int main()
{
    std::vector<std::vector<cv::DMatch>>::iterator matchIterator = vMatch.begin();
    // vMatch是一个std::vector<std::vector<cv::DMatch>>对象
    if (matchIterator != vMatch.end())
        matchIterator->clear();
    return 0;
}

具体代码在10L,您能帮忙看下吗


你这个代码有什么问题?

=================16楼=====================

引用 15 楼 jianwen0529 的回复:
Quote: 引用 14 楼 qq_31679731 的回复:

Quote: 引用 7 楼 jianwen0529 的回复:

Quote: 引用 4 楼 qq_31679731 的回复:

Quote: 引用 1 楼 sdghchj 的回复:

matchIterator没有被初始化啊
确实没初始化,但是为什么以下这段代码就运行没问题呢?

vector<int> a;
a.clear();
return 0;


a本身就是一个存在的对象,而你迭代器没有指向一个有效的对象

int main()
{
    std::vector<std::vector<cv::DMatch>>::iterator matchIterator = vMatch.begin();
    // vMatch是一个std::vector<std::vector<cv::DMatch>>对象
    if (matchIterator != vMatch.end())
        matchIterator->clear();
    return 0;
}

具体代码在10L,您能帮忙看下吗


你这个代码有什么问题?

当到执行到这里时就会中断
出现
然后就跳到这里了

=================17楼=====================


for (std::vector<std::vector<cv::DMatch> >::iterator matchIterator = matches.begin();matchIterator != matches.end()-1;++matchIterator)


为什么是matchIterator != matches.end()-1?如果matches为空,会发生什么情况呢?

=================18楼=====================

引用 17 楼 lunat 的回复:

for (std::vector<std::vector<cv::DMatch> >::iterator matchIterator = matches.begin();matchIterator != matches.end()-1;++matchIterator)


为什么是matchIterator != matches.end()-1?如果matches为空,会发生什么情况呢?

不好意思,之前改错的,没有-1
原始版本代码如下

int imgprocess::ratioTest(std::vector<std::vector<cv::DMatch> >& matches, double ratio)
{
//遍历所有匹配
for (std::vector<std::vector<cv::DMatch> >::iterator matchIterator = matches.begin();matchIterator != matches.end();++matchIterator)//?
{
//如果识别两个最近邻
if (matchIterator->size()>1)
{
//检查距离比率
if ((*matchIterator)[0].distance / (*matchIterator)[1].distance>ratio)
{
matchIterator->clear();//移除匹配
}
}
else//不包括两个最近邻,则舍去该特征点
{
matchIterator->clear();
}
}
return 1;
}

=================19楼=====================

引用 10 楼 qq_31679731 的回复:
程序中的代码是这样的

int imgprocess::ratioTest(std::vector<std::vector<cv::DMatch> >& matches, double ratio)
{
//遍历所有匹配
for (std::vector<std::vector<cv::DMatch> >::iterator matchIterator = matches.begin();matchIterator != matches.end()-1;++matchIterator)//?
{
//如果识别两个最近邻
if (matchIterator->size()>1)
{
//检查距离比率
if ((*matchIterator)[0].distance / (*matchIterator)[1].distance>ratio)
{
matchIterator->clear();//移除匹配
}
}
else//不包括两个最近邻,则舍去该特征点
{
matchIterator->clear();
}
}
return 1;
}

进入else的->clear执行我觉得是
matchIterator是第二行数据
时,
那么当这个元素为0是不能进行->操作吗?
如果想进行->clear操作该如何改呢,谢谢大家~

不好意思,这层代码有误,原始代码在18L

=================20楼=====================

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved