2011-02-09 48 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);。另外,您可能會考慮的一件事是在函數中構建矢量並將其作爲正常返回。這很可能會被編譯器優化。如果您沒有使用具有返回值優化功能的編譯器,那麼您可能通過更改編譯器而不是嘗試手動調整代碼來獲得更好的結果。

而且,如果您擔心傳遞大數據結構,字符串參數是什麼?這不是很大嗎?