2009-02-27 11 views
1
std::vector< std::vector<coords> >::iterator iter; 
for(iter = characters.begin(); iter != characters.end(); iter++) 
{ 
    std::vector<coords>* cha = iter; // doesn't work. 
} 

// does work. 
std::vector<coords>* character = &characters.at(0); 
coords* first = &character->at(0); 

そして、私は理由が分かりません。 iterは、コンテナが '含む'と考えられる型の要素へのポインタではないと思われますか?イテレータを介して別のベクター内のベクトル要素にアクセスしますか?

誰でもこれについて光を当てはめることができますか?

ことでは私が意味する動作しません:私には意味の全体の多くを作成しません

error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::vector<_Ty> *' 

答えて

6

イテレータは、ポインタのように逆参照できる型です。つまり、明示的にoperator*()operator->()です。ポインタである必要はありません。

ベクトルのアドレスを取得する場合は、&*iterを使用してください。

3

MSNの答えをさらに明確にするために、イテレータはコンテナの個々のアイテムのラッパーとして考えることができますが、インクリメント(++ iter)、デクリメント(++ iter)などのスマートもあります。コンテナのタイプ/実装によっては、基になるデータ構造が連続したメモリブロックではないことに注意してください。実際の値にアクセスするには、

1)イテレータderefenceは、

Type t = *iter;

2)例えば、コンテナ型へのポインタとしてイテレータを扱うなどでき

iter->someFuncOnTheContainerType();

1

私は知っていることが分かっていますが、あなたのforループで試してみることもできます:

std::vector<coords> & cha = * iter; 

また、あなたが求めているのではなく、FYIだけですが、ベクトルはランダムアクセスイテレータをサポートしています。

for(size_t i=0; i<characters.size(); i ++) 
をそして、あなたが戻っイテレータに変換するために必要な場合は、あなたが使用できます:あなたも書くことができる意味

characters.begin() + i 

それは物事のC++の方法ではない、それは一般的なイテレータを破ります哲学だが、その用途がある。

関連する問題