2017-06-23 82 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

因为迭代器是相对于你从容器中获取的容器。由于你是通过值传递你的向量,它就像是第二个向量,它不会使发送来比较来自第一个向量的迭代器和来自复制向量的迭代器。