2012-01-09 7 views
2

イテレータに問題があります。C++イテレータエラー

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++) 
{ 
    vector<int> var = *it; 
    sort(var.begin(), var.end()); 
} 

OKと、このコードを使用することです:このコードは、なぜあなたは私を説明してもらえますか?コンパイラによれば、メンバーはまだ始まっていないが、なぜか分からない。

+1

また、最初のループには外的な影響はありません。ベクターをローカルにコピーしてソートしてから、破棄されます。非const参照として 'var'を宣言する必要があります。 –

+0

私はチェックして、それは(参考に)動作します。ありがとう。もう1つの質問。イテレータは非constポインタなので、const参照は使用できません。 'const_iterator'を作ろうとしたとき、コンパイルされませんでした。 sortメソッドが要素を変更しているときに、変数 'var'がベクトルの先頭にある別の要素を指している必要があります(したがってconstにすることはできません)? – JosephConrad

答えて

11

オペレータの優先順位。

*it.begin()は、*(it.begin())と同じです。 (*it).begin()(または同等の式it->begin())が必要です。ある

、あなたは、「オブジェクトのメンバ関数begin()を呼び出すitで指さ、」する必要がある「it上メンバ関数begin()を呼び出した結果を欽慕」ではない(itが理由です何のメンバ関数begin()を、持っていませんコンパイラはエラーメッセージを表示します)。

+0

本当にありがとう! – JosephConrad

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は単にitとして何のメンバーbeginを持っていないが、単純なイテレータです。