请看一下这个例子:
#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
}
我知道一个例子的代码很多。
现在你不必花费数年时间思考这[应该]做什么[es]:我有一个类myMainContainer
,它的唯一成员是mySubContainer
的实例。 mySubContainer
只有一个字符串val
作为成员。
所以我创建了一个向量并用一些示例数据填充它。
现在,我想要做的是:迭代向量并创建一个单独的函数,能够修改向量中的当前myMainContainer。但是,矢量保持不变,因为输出告诉:
0: Value before='foo'
0: Value after='foo'
1: Value before='bar'
1: Value after='bar'
doSomethingWith必须返回void,我不能让它返回修改后的myMainContainer
,然后只是在向量中覆盖它,这就是为什么我试图通过引用传递它,如上面的doSomethingWith定义所示。< / p>
答案 0 :(得分:11)
你在这里复制了这个载体:
current = vec.at( i );
并修改current
,但打印原始文件vec.at(i)
。
相反,直接修改对象,例如
doSomethingWith(vec[i]); // or vec.at(i) for checked access.
答案 1 :(得分:2)
修改内部循环以不复制,但使用引用并维护引用;
myMainContainer ¤t = vec[ i ];
doSomethingWith( current );
请记住,当传递引用时,只要原始容器未被修改,它们可能只有效。
答案 2 :(得分:1)
current = vec.at(i);
doSomethingWith(current);
将其更改为:
doSomethingWith(vec.at(i));
答案 3 :(得分:0)
如果我理解正确,那么矢量将存储数据的副本,而不是直接存储数据。我想知道所建议的答案是否真的有用,因为无论如何都会提供数据副本。要更改数据,我认为您需要执行以下操作。 1.将指针直接存储到对象而不是对象。 2.使用指针获取对象并对指针
处的数据进行更改我认为这将解决你的问题。