2011-04-05 127 views
0

有人可以向我解释为什么下面的代码工作并产生真实? v1.begin()会产生一个迭代器,但是如果我在比较函数内检查v1.begin()的值,我会看到该向量的第一个元素的值。矢量迭代器和模板函数

这是否与需要使用typename vector<T>::iterator它命名模板内的迭代器有关?这将是巨大的,如果有人能在这个

感谢阐述

template<class U, class V> bool compare(const U &v1, const U &v2, const V &v3) { 
    if ((v1 == v2) && (v2 == v3)){ 
     return 1; 
    } else { 
     return 0; 
    } 
} 


#include<iostream> 
#include<vector> 
using namespace std; 

int main() { 

    vector<int>  v1(10,3); 
    vector<int>  v2(10,3); 
    bool iComp = compare(v1.begin(), v1.begin() + 2, v2.begin()); 
    cout << typeid(v1.begin()).name() << " " << *v2.begin() << endl; 

    return 1; 
} 
+2

'iComp'评估为'false'。所以我不明白这个问题! – 2011-04-05 23:39:48

+0

你说得对,我没有检查iComp的值,只是函数中v1,v2和v3的值。我不知道是什么原因,但在VC++ 2010 inisde中悬停在v1,v2和v3上,该函数显示3个变量的值,所以我推测它会产生True。它不如逻辑告诉我的那样很棒。对不起,没有仔细检查过。 – RandomCPlusPlus 2011-04-05 23:47:06

+2

Visual C++有助于显示迭代器指向*的内容。这就是你所看到的。 'v1','v2'和'v3'都是迭代器。 – 2011-04-05 23:53:09

回答

1

compare回报true当且仅当所有三个迭代器指向同一个对象。如果迭代器指向不同类型的对象,则可能存在编译错误。

迭代器指向不同的对象,因为参数都不相同,所以compare返回false。这个结果被扔掉了。

然后程序打印一个唯一的字符串,标识类型std::vector<int>::iterator。如果<vector>实现使用typedef T *iterator,这可能是一个很长的字符串,提到片段std,vectoriterator,或者它可能只是pi“指向整数”。

最后它打印10,因为这是v2中的第一个值。