数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

关于二维vector数组,迭代器clear的问题-CSDN论坛

来源:互联网  责任编辑:小易  时间:2018/1/21 10:31:30
本网有用户碰到这样的问题:关于二维vector数组,迭代器clear的问题-CSDN论坛,具体问题如下:

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

解决方案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即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

解决方案21:

引用 19 楼 qq_31679731 的回复:
不好意思,这层代码有误,原始代码在18L


看不出有什么可能导致崩溃的地方

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