2017-09-14 40 views
0

在下面的代碼中,我想將矢量v設置爲矢量in,但未複製其內容,但由於v已被聲明,因此無法使用像vector<int> &v = in這樣的引用。我應該做些什麼來防止複製?從不是到作爲一個別名將預先聲明但未初始化的矢量設置爲另一個別名

class pt 
{ 
private: 
    vector<int> v; 
    int size; 

public: 
    void construct(int n) 
    { 
     for (int i = n - 1; i >= 0; --i) 
     { 
      v[i] = v[i - 1] + v[i - 2]; 
     } 
    } 

    pt(vector<int>& in, bool no_Copy = false) 
    { 
     if (no_Copy) 
     { 
      &v = in; //I want to fix this 
     } 
     else {} 

     construct(in.size()); 
    } 
    //other functions which use `v` 
}; 
+1

聲明「將矢量A設置爲矢量B而不復制其內容」在C++中沒有任何意義。這就像是說:「拿着左邊閃亮球的盒子,把這個盒子放在你的右邊,但是沒有在盒子裏面移動任何閃亮的球,它們必須留在你的左邊。 –

+2

我認爲這可能是一個[ XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你真正想要解決的問題是什麼?'pt'的目的是什麼? – Brian

+0

@SamVarshavchik我的意思是類似於像'vector &v ='這樣的參考文件' – user8611116

回答

1

喜歡的東西

vector<int> v; 

不能是 「切換」。

您可以使其始終爲別名,在一種情況下,它指的是傳入的in矢量,另一種情況下指的是in矢量的副本。

例如:

class pt 
{ 
private: 
    vector<int>& v; 
    vector<int> v_copy; 

... 

pt(vector<int>& in, bool no_Copy = false) 
: v(no_Copy ? in : v_copy) 
{ 
    if(!no_Copy) v_copy = in; 
} 

或者你也可以從in移動,如@Carl在註釋建議。這很快,但會破壞in載體。