* iter.first和iter->首先有什么区别?

时间:2016-06-05 07:35:09

标签: c++11 stl minmax

vector<int> a = { 1,2,3,4,5,6,7 };
pair<vector<int>, vector<int>::iterator> pair_of_itr;    //not working showing wrong directional error!
auto pair_of_itr = minmax_element(a.begin(), a.end());
cout << *pair_of_itr.first << " " << *pair_of_itr.second << endl;  // working with auto  but not with the PAIR of iterator.
//cout << pair_of_itr->first << " " << pair_of_itr->second << endl  // not working
return 0;

这里我通过评论解释。请参阅评论。

1 个答案:

答案 0 :(得分:1)

a->b(*a).b相同。 *a.b*(a.b)相同。因此,a是否已取消引用,或a.b是否已取消引用,它们会有所不同。

在您的情况下,auto pair_of_itr = std::minmax_element ...创建std::pair个迭代器,它是您要取消引用的迭代器。那就是*pair_of_itr.first*pair_of_itr格式错误,因为std::pair本身不是指针或迭代器。

pair<vector<int>, vector<int>::iterator> pair_of_itr;的问题只是该对的第一个元素是std::vector,而不是std::vector::iterator。因此,在这种情况下,pair_of_itrpair_of_itr.first都不能被解除引用。 *pair_of_itr.second将编译,因为第二个元素是迭代器。

添加多余的括号通常是个好主意,特别是如果您需要询问是否有必要。其他人也可能不记得*a.b表示*(a.b),并且括号不会花费太多。