引用一个向量

时间:2011-02-09 16:10:32

标签: c++ reference tokenize

我有这段代码

void split(vector<float> &fvec, string str)
{
    int place = 0;
        for(int i=0; i<str.length(); i++)
        {
            if(str.at(i) == ' ')
            {
                fvec.push_back(atoi(str.substr(place,i-place).c_str()));
                place=i+1;
            }
        }
        fvec.push_back(atoi(str.substr(place).c_str()));
}

我试图做的是将一个向量的引用传递给方法,所以它将字符串拆分为浮点数而不复制向量...我不想复制向量,因为它将包含1000的数字。

是不可能通过引用传递一个向量,或者我只是犯了一个愚蠢的错误?

如果它有助于继承代码我用

测试它
int main (void)
{
    vector<float> fvec;
    string str = "1 2 2 3.5 1.1";

    split(&fvec, str);

    cout<<fvec[0];

    return 0;
}

4 个答案:

答案 0 :(得分:7)

确实有可能。你只是使用了错误的语法。正确的方法是:

split(fvec, str);

你所做的是错误的,因为它将向量的地址作为预期参考传递。

答案 1 :(得分:2)

如果您使用的是现代编译器,例如gcc / g ++,它会为您命名返回值优化,因此您无需通过引用或指针传递返回值。

请参阅:

http://en.wikipedia.org/wiki/Return_value_optimization/

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

答案 2 :(得分:1)

您正在传递矢量的地址。 (split(&fvec, str);

调用应为split(fvec, str);,而不是&

答案 3 :(得分:0)

跳出来的显而易见的事情是split(&fvec, str);函数中的main,这意味着你没有传递向量而是传递向量的地址。如果你的vector参数是一个指针,这是正确的做法,但如果它是一个引用则不行。请改用split(fvec, str);

此外,您可以考虑的一件事是在函数中构建向量并正常返回它。这很可能由编译器优化。如果您没有使用具有返回值优化功能的编译器,那么通过更改编译器而不是手动调整代码,您可能会获得更好的结果。

而且,如果您担心传递大数据结构,那么字符串参数是什么?那不是很大吗?