C++ c++;vector将所有元素存储为最后一个元素

C++ c++;vector将所有元素存储为最后一个元素,c++,opencv,vector,C++,Opencv,Vector,所以我试图将矩阵数据从xml文件存储到rawFaceData向量。当我在第一个for循环中检查cout语句时,它会返回我想要的向量中所有元素的值。但是,当它跳出第一个for循环并转到第二个for循环时,cout始终为我提供与最后一个元素完全相同的所有元素(例如,如果向量大小为4,则cout为我提供最后一个元素的值4次!),之前的元素的值就消失了。谁能告诉我为什么???谢谢大家! vector<Mat> rawFaceData; Mat temp; FileStorage fsRead

所以我试图将矩阵数据从xml文件存储到rawFaceData向量。当我在第一个for循环中检查cout语句时,它会返回我想要的向量中所有元素的值。但是,当它跳出第一个for循环并转到第二个for循环时,cout始终为我提供与最后一个元素完全相同的所有元素(例如,如果向量大小为4,则cout为我提供最后一个元素的值4次!),之前的元素的值就消失了。谁能告诉我为什么???谢谢大家!

vector<Mat> rawFaceData;
Mat temp;
FileStorage fsRead = FileStorage();
//output xml datas to a Mat vector for calculation
for(int readCount = 1; readCount < count; readCount++){
    ssfilename.str("");
    ssfilename<<name<<readCount<<postfix;
    filename = ssfilename.str();
    cout<<filename<<endl;
    fsRead.open(filename, FileStorage::READ);
    fsRead["ImageData"]>>temp;
    rawFaceData.push_back(temp);
    cout<<rawFaceData[readCount-1]<<endl;
}
//now raw image datas are now all in the Mat vector, there are count-1 elements in this vector.
//following is avg calculation of the training images.
for(int i = 0; i < rawFaceData.size(); i++){
    cout<<rawFaceData[i]<<"\n"<<endl;
}
矢量数据;
垫温;
FileStorage fsRead=FileStorage();
//将xml数据输出到Mat向量以进行计算
对于(int readCount=1;readCountMat是指针吗?如果是这种情况,并且您要推送到向量中的是指针类型,那么在您退出第一个for循环后,向量中的所有值都将指向同一地址,从而导致您看到的行为。

OpenCV
Mat
类使用共享指针和引用计数机制来存储数据并避免u无需深度拷贝

每次您将数据从
文件存储
读取到
临时
中时,数据都会在同一内存位置更新,对
临时
数据的所有引用现在都指向新数据。即,旧数据被覆盖

将Mat推入向量时,数据不会复制到向量的元素中。相反,只向向量添加一个引用,并且
temp
的引用计数器会递增。因此,实际上,向量的所有元素都包含相同的数据

您可能需要将
temp
的一个深拷贝压回向量,如下所示:

rawFaceData.push_back(temp.clone());

文件读取是混乱的,你可以忽略它们。我认为在你的第一个for循环中,计数器没有正确地更新,这是导致同一个元素每次都在vector中被推回。显示了“代码> Mat < /Case>类的定义和实现。听起来好像它没有正确的语义语义。我是C++的新手,所以我我想知道,如果我没有将temp声明为指针,为什么temp是一个指针?因为我使用了Mat temp;而不是Mat*temp;@user3513507,它不是
Mat
指针。但是
Mat
是一个奇怪的类。一个解决方案可能是在循环内部创建
Mat
。@juanchopanza..
Mat
类使用sh在内部存储数据ared指针并使用引用计数。它的复制构造函数和赋值运算符不执行深度复制。它有一个
clone
成员函数来执行深度复制。@sgar91是的,我知道。我认为这是一个糟糕的设计。无论如何,我可能只是在循环中声明
Mat
rawFaceData.push_back(temp.clone());