2017-06-23 35 views
0
#include <iostream> 
#include <vector> 

using namespace std; 

void factorial(vector<int> ivec, typename vector<int>::iterator iter) 
{ 
    vector<int>::iterator it; 
    for (it = iter; it != ivec.end(); it++) 
     cout << *it << endl; 
} 

int main() 
{ 
    vector<int> ivec; 
    for (int i = 1; i < 8; i++) 
     ivec.push_back(i); 

    factorial(ivec, ivec.begin()); 

    return 0; 
} 

在視覺工作室2015,它表明,容器作爲函數參數

enter image description here

但如果我讓ivec爲引用類型(vector<int> & ivec),它會成功地工作。

爲什麼?


代碼壞,壞,壞,,,所以請你只關注這個問題。

回答

0

因爲您通過值複製向量並使it != ivec.end()未定義。

當你按值傳遞你正在做這樣的事情

vector<int> v1 = {1,2,3,4,5,6,7}; 
vector<int> v2 = v1; 
//v2 is a copy of v1 

v1.end() == v2.end(); 
//comparing end of different vectors don't have any sense. 

當你通過引用傳遞,你正在做的事情一樣

vector<int> v1 = {1,2,3,4,5,6,7}; 
vector<int>& v2 = v1; 
//v2 is a reference to v1, it's like an alias 

v1.end() == v2.end(); 
//it makes sense because v2 is v1, not a copy 

或者如果你比較熟悉的指針

vector<int> v1 = {1,2,3,4,5,6,7}; 
vector<int>* v2 = &v1; 

v1.end() == v2->end(); 
1

因爲迭代器是相對於你從容器中獲取的容器。由於你是通過值傳遞你的向量,它就像是第二個向量,它不會使發送來比較來自第一個向量的迭代器和來自複製向量的迭代器。