碰到了个神奇的让人痛苦的iterator现象,请大家帮忙看看!

ny1986 2020-07-10 10:32:15
代码如下所示,建立了一个vector<Mat>,使用迭代器访问里面的每张图像,本想给里面每张图像相同坐标处的像素分别赋予不同的值,结果发现后面的赋值会把前面的赋值给覆盖掉,迭代器不是可以用+n的方式来分别访问容器中相应位置上的每张图像的吗?这里怎么会出现后面的值改变,然后前面的自动就全改变的现象呢?想了好久也没弄明白,实在是痛苦,请各位帮忙看一下。谢谢了。
代码如下:

Mat imgFused(m_imgSize.height, m_imgSize.width, CV_64FC1, Scalar::all(0));
vector<Mat> imgFusedSet;
for (int i = 0; i < 9; i++)
{
imgFusedSet.push_back(imgFused);
}
//建立迭代器以访问融合图像
vector<Mat>::iterator it_imgfused = imgFusedSet.begin();
vector<Mat>::iterator itend_imgfused = imgFusedSet.end();

for (int i = 0; i < m_imgSize.height; i++)
{
for (int j = 0; j < m_imgSize.width; j++)
{
(*it_imgfused).at<double>(i, j) = 54;
cout << (*it_imgfused).at<double>(i, j) << endl;
cout << endl;


(*(it_imgfused + 1)).at<double>(i, j) = 100;
cout << (*(it_imgfused + 1)).at<double>(i, j) << endl;
cout << (*it_imgfused).at<double>(i, j) << endl;
cout << endl;

(*(it_imgfused + 2)).at<double>(i, j) = 120;
cout << (*(it_imgfused + 2)).at<double>(i, j) << endl;
cout << (*it_imgfused).at<double>(i, j) << endl;
cout << (*(it_imgfused + 1)).at<double>(i, j) << endl;
cout << endl;


(*(it_imgfused + 3)).at<double>(i, j) = 130;
cout << (*(it_imgfused + 3)).at<double>(i, j) << endl;
cout <<(*it_imgfused).at<double>(i, j) << endl;
cout << (*(it_imgfused + 1)).at<double>(i, j) << endl;
cout << (*(it_imgfused + 2)).at<double>(i, j) << endl;
cout << endl;


(*(it_imgfused + 4)).at<double>(i, j) = 150;
cout << (*(it_imgfused + 4)).at<double>(i, j) << endl;
cout << (*it_imgfused).at<double>(i, j) << endl;
cout << (*(it_imgfused + 1)).at<double>(i, j) << endl;
cout << (*(it_imgfused + 2)).at<double>(i, j) << endl;
cout << (*(it_imgfused + 3)).at<double>(i, j) << endl;
cout << endl;


(*(it_imgfused + 5)).at<double>(i, j) = 50;
cout << (*(it_imgfused + 5)).at<double>(i, j) << endl;
cout << (*it_imgfused).at<double>(i, j) << endl;
cout << (*(it_imgfused + 1)).at<double>(i, j) << endl;
cout << (*(it_imgfused + 2)).at<double>(i, j) << endl;
cout << (*(it_imgfused + 3)).at<double>(i, j) << endl;
cout << (*(it_imgfused + 4)).at<double>(i, j) << endl;
cout << endl;
}
}

程序运行结果如下:
54

100
100

120
120
120

130
130
130
130

150
150
150
150
150

50
50
50
50
50
50
...全文
104 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2020-07-11
  • 打赏
  • 举报
回复
因为Mat的复制构造函数用的是浅拷贝,在 vector中,他们其实是一个东西,所以你修改一个其余全改 建议用Mat.Clone,插入到vector
真相重于对错 2020-07-11
  • 打赏
  • 举报
回复
你的理解是错误,push_back是利用了完美转发,你传递右值,才会调用移动构造,传递左值,用的是复制, mat的cpoy construct 不支持 深复制,必须用clone,否则复制后的对象与原对象使用同一个内部信息。
ny1986 2020-07-11
  • 打赏
  • 举报
回复
多谢多谢。pushback()中是传引用方式使用了imgFused,从而形成了浅拷贝,所有的迭代器其实都指向了同一片内存,所以改变一个其他也就跟着都变了。现在问题已经解决,真是给自己提了个醒,一定要注意深拷贝和浅拷贝的问题。多谢帮助,分数奉上。

64,696

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧