2012-01-09 114 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是一個簡單的迭代器。