2012-01-09 103 views
2

我有一个迭代器的问题。你能解释我为什么这个代码:C++迭代器错误

vector<vector<int> >::iterator it = v.begin(); 
for(; it < v.end(); it++) 
{ 
    vector<int> var = *it; 
    sort(var.begin(), var.end()); 
} 

是确定与此代码:

vector<vector<int> >::iterator it = v.begin(); 
for(; it < v.end(); it++) 
{ 
    sort(*it.begin(), *it.end()); 
} 

是错的?编译器说*它没有成员开始,但我不知道为什么。

+1

另请注意,您的第一个循环没有外部效应 - 您将矢量复制到本地,将其排序,然后将其丢弃。你应该声明'var'作为非const引用。 – 2012-01-09 22:30:11

+0

我已经检查过它的工作原理(参考)。谢谢。还有一个问题。我不能使用const引用,因为迭代器是一个非const指针?当我试图创建'const_iterator'时,它没有编译。也许当sort方法正在改变元素时,变量'var'应该指向另一个位于向量开头的元素(因此它不能是const)? – JosephConrad 2012-01-09 23:22:04

回答

11

运算符优先级。

*it.begin()*(it.begin())相同。您需要(*it).begin()(或等效表达式,it->begin())。

也就是说,你需要“调用成员函数指向it,对象的begin()”不“顺从调用成员函数begin()it的结果”(it没有成员函数begin(),这是为什么编译器会给你提供的错误信息)。

+0

确实,非常感谢! – JosephConrad 2012-01-09 21:57:28

4

运算符“。”绑定比操作符“*”更强。尝试

vector<vector<int> >::iterator it = v.begin(); 
for(; it < v.end(); it++){ 
    sort(it->begin(), it->end()); 
} 

改为。

你的代码是这样的:

vector<vector<int> >::iterator it = v.begin(); 
for(; it < v.end(); it++) 
{ 
    sort(*(it.begin()), *(it.end())); 
} 

it根本没有成员beginit是一个简单的迭代器。