ページ 11

イテレータ→添え字

Posted: 2012年3月16日(金) 21:38
by Cr

コード:

vector<int> vec;
//入力
vector<int>::iterator ite = find(vec.begin(),vec.end(),5);
のような状態でiteから添え字を取り出すにはどうすればいいのでしょうか?

Re: イテレータ→添え字

Posted: 2012年3月16日(金) 21:45
by tk-xleader
std::vector<int>::iterator::difference_type index = ite - vec.begin();

でいいと思います。

Re: イテレータ→添え字

Posted: 2012年3月16日(金) 21:46
by beatle
どんなイテレータに対しても同じように書きたい場合は、std::distanceが使えます。beginとの距離を求めるわけです。
vectorのイテレータに限れば、vectorのイテレータはランダムアクセスイテレータですので、beginと引き算することによっても添字を計算することができます。

Re: イテレータ→添え字

Posted: 2012年3月16日(金) 21:55
by tk-xleader
やっぱり、こっちのほうがよさそうです。

std::iterator_traits<std::vector<int>::iterator>::difference_type index = ite - vec.begin();

Re: イテレータ→添え字

Posted: 2012年3月18日(日) 14:31
by Cr
>beatleさん
どんなイテレータに対しても同じように書きたい場合は、std::distanceが使えます。beginとの距離を求めるわけです。
うまく行きました!ありがとうございます。
調べたところ返り値はint型のようですね

>tkmakwins15さん
やっぱり、こっちのほうがよさそうです。

std::iterator_traits<std::vector<int>::iterator>::difference_type index = ite - vec.begin();
チャットでも教えていただいてありがとうございます。
::difference_typeを常に取り出せるとは限らない(ポインタとかは無理)
iterator_traits<>に渡せば::difference_typeを常に取り出せる。
だからiterator_traits<>にvector<int>::iteratorを渡してそこから::difference_typeを取り出す。
…っていうことですよね?
まだあやふやですが教えてもらったサイト(http://episteme.wankuma.com/stlprog/index.html)等活用しながら慣れたいと思います。

お二方どうもありがとうございました。