2014-05-02 114 views
-1

如果函數採用參數vector<int>&,那究竟是什麼意思?這與說出矢量中包含的指針的值是否相同?我完全理解vector<int&>;只是一些關於外面的&讓我感動。什麼是矢量引用?

+0

會有幫助:[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),[指針之間有什麼區別C++中的變量和引用變量?](http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c?rq=1) – Drop

+0

那很有意思。我是相反的,因爲你我因爲我明白'矢量&'但不明白'矢量' – texasbruce

回答

0

沒有&矢量的副本將被傳遞給函數。
=所有元素的副本。更改/插入/刪除...不會影響原始矢量。
(如果你有一個指針向量或類似的東西,它們仍然指向相同的東西,但指針本身也被複制)。

使用&您將在該函數中具有相同的矢量,並且所有的修改都將在外部可見。此外,如果它不是非必要的(可能是因爲整個移動語義& co。topic),它可能會更快地不復制所有內容。

0

它是一個參考,其中被引用的對象的類型爲vector<int>

除了類型之外,這與任何其他參考都是一樣的。如果你不熟悉引用,它們是同一個變量提供多個標籤的方式:

int a = 5; 
int &b = a; 

// now "a" and "b" are both labels for the same variable. any 
// expression involving `a` can have that exchanged for `b` 
// without making any difference. 

a = 6; 
std::cout << b << std::endl; // 6 

在這種情況下,你都在談論:

void func(vector<int> &b) { b.push_back(6); } 

int main() 
{ 
     vector<int> a; 
     func(a); 
     std::cout << a[0] << std::endl;  // 6 
} 

這意味着再次ab是兩個標籤都是同一個矢量。

我完全理解vector<int&>

vector<int&>是非法的,所以希望你的「完全理解」的是,它是非法的。不可能擁有引用的數組或容器。

1

vector<int>&是一個向量的引用,vector<int&>是INT參考矢量,事實上vector<int&>將簡單地不進行編譯,更詳細地: Why can't I make a vector of references?

+0

甚至沒有鏈接從堆棧溢出本身? –

+0

好的...對不起,忘記我說的:) – deviantfan

0

當一個函數接受「載體&」,它被說成是通過參考傳遞。假設你的矢量參考參數被命名爲vec。我們假設你想給你的int向量中的所有元素賦0。您可以鍵入:

int assign_zero(vector<int> vec){ 

    for(auto &x : vec){ 
    x = 0; 
    } 
} 

有了這個,你可以在你的主要方法類型的東西像這樣:

originalVector = assign_zero(originalVector); 

你也可以在你的函數中使用到的矢量的參考做到相同的事情(注意函數現在無效):

void assign_zero(vector<int>& vec){ 
    for(auto &x : vec){ 
    x = 0; 
    } 
} 

現在,而不是在存儲器中從originalVector創建零的新載體中,然後分配回originalVector,函數assign_zero()米直接減少矢量。這使您可以使用一個函數調用像這樣沒有創建額外的向量,其中:

assign_zero(originalVector); 

注意與矢量參考的功能並不需要是無效的。