2011-02-09 47 views
2

我有这样的代码引用向量

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个数字。

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

如果它有助于继承人的代码与IM

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

    split(&fvec, str); 

    cout<<fvec[0]; 

    return 0; 
} 
+0

显然,某些事情没有按照您预期的方式发生,或者您不会发布此信息。对于那件事,你期望什么,究竟发生了什么? – 2011-02-09 16:14:16

回答

7

测试它的确是可能的。你只是使用错误的语法。正确的方法是:

split(fvec, str); 

你在做什么是错误的,因为它将向量的地址作为预期的参考。

+0

仍然在使用C++,感谢您的帮助。只是为了检查,如果我有void方法(int&x)我只需要传入一个int,如方法(int)? – CurtisJC 2011-02-09 16:23:33

+1

是的。通话看起来是一样的。你不知道`method(bob)`是通过值还是通过引用传递bob。你必须看看这个方法的定义。 – fouronnes 2011-02-09 16:26:21

1

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

该呼叫应该是split(fvec, str);而不是&

0

是飞跃出了明显的事情是在你的main功能,这意味着你不能传递一个向量而是一个向量的地址split(&fvec, str);。如果你的vector参数是一个指针,那么这是正确的,但如果它是一个引用,则不是。改为使用split(fvec, str);。另外,您可能会考虑的一件事是在函数中构建矢量并将其作为正常返回。这很可能会被编译器优化。如果您没有使用具有返回值优化功能的编译器,那么您可能通过更改编译器而不是尝试手动调整代码来获得更好的结果。

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