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

Posted

技术标签:

【中文标题】C++ 向量指针/引用问题【英文标题】:C++ vector pointer/reference problem 【发布时间】:2010-04-05 10:42:24 【问题描述】:

请看一下这个例子:

#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 定义中所示。

【问题讨论】:

【参考方案1】:

您正在这里制作矢量的副本:

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 );

请记住,在传递引用时,它们可能仅在原始容器未被修改时才有效。

【讨论】:

【参考方案3】:
current = vec.at(i);
doSomethingWith(current);

改成:

doSomethingWith(vec.at(i));

【讨论】:

【参考方案4】:

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

我认为这会解决你的问题。

【讨论】:

以上是关于C++ 向量指针/引用问题的主要内容,如果未能解决你的问题,请参考以下文章

c++ 引用向量的问题?

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

如何从 C++ 中的“指向对象的指针”向量访问对象

C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?

C++ - 返回指针或常量引用

取消引用指向访问元素的向量指针