人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C++等で、for 文を unsigned int のカウンタで N から 0 までループをするときに

for( unsigned int i=10; i>=0; i-- )

と書くと、i=0 の次は正の最大値になってループが終わりません。

皆さんはこういう場合(たとえばvectorを逆順にアクセスし、インデクスの値もループ内で使いたい場合)どうしますか?
非常に主観的かつ興味本位ですが、int を使う以上に「気持ちいい」解決策があれば見てみたいと思い質問しました。

●質問者: やまりょう
●カテゴリ:コンピュータ
✍キーワード:C++ Vector アクセス カウンタ ループ
○ 状態 :終了
└ 回答数 : 9/9件

▽最新の回答へ

1 ● HowAreYou
●30ポイント

i が最大値を取らないのなら

for ( unsigned int i = 10; i <= 10; i-- )

とか。

◎質問者からの返答

ありがとうございます。

しかし可読性が微妙で、こう書くくらいなら int を使うだろうなと思います。


2 ● JULY
●30ポイント

unsigned int i = UINT_MAX;

do {

ほにゃらら;

i--;

} while (i != UINT_MAX);

とすれば、UINT_MAX 回、ほにゃららが実行されることにはなるかな。

でも、コメントなしで、この終了条件が理解されることは無いと思う。

◎質問者からの返答

ありがとうございます。

ループの外側に変数を作れば

unsigned int i=N;

do{

xxx;

i--;

}while( i != 0 )

とできますね。


3 ● freemann
●30ポイント

iの値を1増やして

for(unsigned int i = 11;i>0;i--) printf("%d",i-1);

という感じに、iが使われるところで-1する。

または、

for(unsigned int i = 10,int j = 10;j >= 0;i--,j--)

という具合に、ループのカウンタだけに使用するintの変数を追加する。

◎質問者からの返答

ありがとうございます。

前者はバグの原因になりそうですね。

後者のような書き方ができるのですね。

でもやっぱり可読性が悪くなるのは避けられないみたいですね。


4 ● しおり
●30ポイント

ループカウンターとインデックスを分けるとか。

#include <vector>
#include <iostream>

typedef std::vector<int> vector_int;

int main()
{
 vector_int ary;
 ary.push_back(1);
 ary.push_back(2);
 ary.push_back(3);
 for ( vector_int::size_type n = ary.size(); n > 0; --n ) {
 vector_int::size_type i = n - 1;
 std::cout << ary[i] << "\n";
 }
}
◎質問者からの返答

ありがとうございます。

色々なやり方を紹介していただきましたが、ところで

皆様は実際にこういう場面でこの書き方をされるのでしょうか?

それともやはり int で書きますか?


5 ● wasisan
●40ポイント

質問とはあまり関係ないですが,

これはいわゆる「番兵」の問題に似ていますね.

番兵 - Wikipedia

方法としては2番の回答と同じことです.

unsignedの場合は,最大値(UINT_MAX)がNULL(無効なデータ)なのだと考えれば

わりと綺麗に理解できるかもしれません.

 #define UINT_NULL UINT_MAX
 
 for ( unsigned int i = 10; i != UINT_NULL ; i-- ) {
 ...
 }

実際,STLなどではイテレータでこういう書き方(!=を使いNULLと比較する)

をよくします.

◎質問者からの返答

これは気持ちがいい(主観ですが)ですね!

#define するだけで全く可読性が変わりますね。

ありがとうございます。


1-5件表示/9件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ