C++ C++;向量指针/引用问题

C++ C++;向量指针/引用问题,c++,vector,pointers,C++,Vector,Pointers,请看一看这个例子: #include <iostream> #include <vector> #include <string> using namespace std; class mySubContainer { public: string val; }; class myMainContainer { public: mySubContainer sub; }; void doSomethingWith( myMainConta

请看一看这个例子:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class mySubContainer
{
public:
    string val;
};

class myMainContainer
{
public:
    mySubContainer sub;
};

void doSomethingWith( myMainContainer &container )
{
    container.sub.val = "I was modified";
}

int main( )
{
    vector<myMainContainer> vec;


    /**
     * Add test data
     */
    myMainContainer tempInst;

    tempInst.sub.val = "foo";
    vec.push_back( tempInst );

    tempInst.sub.val = "bar";
    vec.push_back( tempInst );


    // 1000 lines of random code here

    int i;
    int size = vec.size( );
    myMainContainer current;

    for( i = 0; i < size; i ++ )
    {
        cout << i << ": Value before='" << vec.at( i ).sub.val << "'" << endl;

        current = vec.at( i );
        doSomethingWith( current );

        cout << i << ": Value after='" << vec.at( i ).sub.val << "'" << endl;
    }
    system("pause");//i suck

}
  • 我做错了什么

doSomethingWith必须返回void,我不能让它返回修改后的
myMainContainer
,然后在向量中覆盖它,这就是为什么我试图通过引用传递它,如上面定义的doSomethingWith所示。

您正在制作向量的副本:

current = vec.at( i );
修改当前的,但打印原始的,在(i)处的向量

而是直接修改对象,例如

doSomethingWith(vec[i]);  // or vec.at(i) for checked access.
将其更改为:

doSomethingWith(vec.at(i));

如果我理解正确的话,那么vector将存储数据的副本,而不是直接存储数据。我不知道所建议的答案是否真的有用,因为无论如何都会制作数据的副本。要更改数据,我认为您需要执行以下操作。 1.存储指向对象的指针,而不是直接存储对象。 2.使用指针获取对象并在指针处对数据进行更改


我认为这将解决您的问题。

修改内部循环,使其不复制,而是使用引用并维护引用

myMainContainer &current = vec[ i ];
doSomethingWith( current );
请记住,在传递引用时,它们可能只有在原始容器未被修改的情况下才有效

doSomethingWith(vec.at(i));
myMainContainer &current = vec[ i ];
doSomethingWith( current );