关于矢量值

时间:2014-01-15 07:05:08

标签: c++ vector stl

下面是一段代码片段。 程序输入是

dimension d[] = {{4, 6, 7}, {1, 2, 3}, {4, 5, 6}, {10, 12, 32}};
PVecDim vecdim(new VecDim());
    for (int i=0;i<sizeof(d)/sizeof(d[0]); ++i) {
        vecdim->push_back(&d[i]);
    }
getModList(vecdim);

程序:

class dimension;
typedef shared_ptr<vector<dimension*> > PVecDim;
typedef vector<dimension*> VecDim;
typedef vector<dimension*>::iterator VecDimIter;

struct dimension {
    int height, width, length;
    dimension(int h, int w, int l) : height(h), width(w), length(l) {

    }
};

PVecDim getModList(PVecDim inList) {
        PVecDim modList(new VecDim());
        VecDimIter it;

        for(it = inList->begin(); it!=inList->end(); ++it) {
            dimension rot1((*it)->length, (*it)->width, (*it)->height);
            dimension rot2((*it)->width, (*it)->height, (*it)->length);

            cout<<"rot1 "<<rot1.height<<" "<<rot1.length<<" "<<rot1.width<<endl;
            cout<<"rot2 "<<rot2.height<<" "<<rot2.length<<" "<<rot2.width<<endl;

            modList->push_back(*it);
            modList->push_back(&rot1);
            modList->push_back(&rot2);
            for(int i=0;i < 3;++i) {
                cout<<(*modList)[i]->height<<" "<<(*modList)[i]->length<<" "<<(*modList)[i]->width<<" "<<endl;
            }
        }
            return modList;
}

我看到的是值rot1和rot2实际上覆盖了以前的值。 例如,对于在顶部定义的输入值,cout语句如下打印。有人能告诉我为什么这些价值被覆盖了吗?

rot1 7 4 6
rot2 6 7 4
4 7 6 
7 4 6 
6 7 4 
rot1 3 1 2
rot2 2 3 1
4 7 6 
3 1 2 
2 3 1 

1 个答案:

答案 0 :(得分:3)

当您执行此类操作时,您正在存储指向局部变量的指针:

modList->push_back(&rot1);

每个循环周期都会失效。你可以通过不首先存储指针来节省很多麻烦。