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

6
请看这个例子:
#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

}

这个示例代码量很大,我知道。

现在,为了让你不必花费数年时间思考这个代码应该做什么:我有一个类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的定义通过引用传递它的原因。

4个回答

11

这里你正在复制向量:

current = vec.at( i );

修改current,但打印原始的vec.at(i)

相反,直接修改对象,例如:

doSomethingWith(vec[i]);  // or vec.at(i) for checked access.

2

修改内部循环,不要复制而是使用引用并保持引用。

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

请记住,当传递引用时,只有在原始容器未被修改的情况下它们才可能有效。

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

将其更改为:

doSomethingWith(vec.at(i));

0
如果我理解正确,发生的情况是向量将存储数据的副本,而不是直接存储数据。我想知道所建议的答案是否实际上有用,因为数据的副本无论如何都会被制作。要更改数据,我认为您需要执行以下操作。 1. 存储对象的指针而不是对象本身。 2. 使用指针获取对象并更改指针处的数据。
我认为这将解决您的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接