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 ¤t = vec[ i ];
doSomethingWith( current );
请记住,在传递引用时,它们可能只有在原始容器未被修改的情况下才有效
doSomethingWith(vec.at(i));
myMainContainer ¤t = vec[ i ];
doSomethingWith( current );