• ベストアンサー

std::for_eachに、ループカウンタを入れる方法。

表題の通りなのですが、次のようなループのカウンタを呼び出される 配列に入れるにはどうしたらいいのでしょうか? const int MAX = 100; int Array[MAX] = {0}; /* //これと同じことをしたいのですが。。。。 for( int i=0; i<MAX; ++i )  Array[i] = i; */ for_each(Array, Array+MAX, /*ここはどうするのでしょう?*/); 調べてみましたが、めぼしいものがみつかりません。 もともと無理なものなのでしょうか? ご教授お願いします。環境はVC8です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  関数オブジェクトが一番楽です。 struct CCounter { CCounter() : m_iRef(0) { } void operator()(int& rVal) { rVal = m_iRef++; } private: int m_iRef; }; static void Print(int iVal) { cout << iVal << endl; } int main(void) { const int MAX = 100; int Array[MAX] = {0}; std::for_each(Array, Array+MAX, CCounter()); std::for_each(Array, Array+MAX, &::Print); return 0; }

qatatatfds
質問者

お礼

早速の回答ありがとうございます。 やはり、明示的に引数にループカウンタを入れるのは無理なので 自分で、カウンタを模したものを、入れるしかないのですね。。。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 配列のindexに依存するようなコードを書くのがもう時代遅れ > だということを暗に意味しているのでしょうかね? 時代遅れということはないと思いますが、STLの方針には合わないということでしょう。 添え字を使う場合、配列、vector、deque、basic_stringなどは問題ないですが、listやsetなどでは無理があります。

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

VC++8に現物合わせするのであれば#1の回答で問題ありません。 しかし、(VC++の将来のバージョンを含めて)他の処理系との移植性を考える場合は適切とはいえません。 まず、for_eachはInputIteratorを要求しますので、その参照先を更新することはできません。更新が必要な場合は、generateなど、他のアルゴリズムを使用すべきです。 次に、状態を持つ関数オブジェクトは、アルゴリズム関数の中で複数回コピーされる可能性があることに注意しなければなりません。常に同じインスタンスを用いて処理できるのであればよいのですが、規格上そのような保証はありません。 また、for_eachの場合、範囲内の各要素に対して前から順に操作することが規定されていますが、generateなどではその規定がありません。すなわち、呼び出される順序に依存する関数オブジェクトは適切ではありません。 つまり、一般的には無理だと思います。

qatatatfds
質問者

お礼

回答ありがとうございます。 その点はまさに、気になっていたことです!! やはり現時点での間に合わせに過ぎないのですね。 配列のindexに依存するようなコードを書くのがもう時代遅れ だということを暗に意味しているのでしょうかね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ループカウンタを使用せず、配列の全てを足したい

    質問です。 配列を使い、その値の合計値を出す際に私はループカウンタを利用して足す手法を 思いつくのですが、それ以外の方法があると聞きました。 ですが、それ以外の方法が思いつかなく質問させてください。 int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int nSum = 0; for ( int i = 0; i < 10; i++ ) { nSum += a[i]; } return nSum; ここでループカウンタを使用せず、配列の全てを足すにはどうしたら良いでしょうか。

  • forループに慣れるには

    初めまして。 今資格を取ろうと思い独学でJavaを勉強してるんですが、 つまらない部分でつまずいています。 それは少々複雑なfor等のループです。 変数を追っていくうちにこんがらがってしまい、 変数の正しい値を見失ってしまいます。 例えば… Loop: for(int i = 0; i<5; i++) { for(int j =0; j<5; j++) { if(i==j) continue Loop; System.out.println("i = " +i+ "j = " +j); if(i > 3) break Loop; } } や、 int i,j; for(i = 0, j = 0; i<3;) { if(i++ == 2 || j++ == 2) break; } System.out.println(i); System.out.println(j); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

  • for 3ループについて教えて

    for 3ループについて教えて * ** *** **** * ** *** **** * ** *** **** と表示させたいのですが、 #include<stdio.h> int main(void) { int i,j,k; for(i=1; i<=4; i++) { for(j=1; j<=i; j++){ // for(k=1; k<=3; k+=i){ } printf("*"); } printf("\n"); } return 0; } * ** *** **** このように表示されてしまいます。//の所が違うなと思います。が、分かりそうで分かりません。 もし、分かるかたがいましたら、教えてください。 よろしくおねがいします。

  • ソート

    お世話になります。配列のソートなのですが、どうも思い通りの結果になりません。 配列の中から最大値と最小値を探し、最小値を配列0に、最大値を配列の最後に移動します。その2つ以外の数字の順番は変えません。 例) {4,3,2,0,1,2} 最小値は0、最大値は4なので→{0,3,2,1,2,4} {4,3,2,1} → {1,3,2,4} {1,3,2,4,} → {1,3,2,4} 流れとしては、まず最小値を求め配列0に移動させ、次に最大値を求め配列の最後に移動させようと思います。 プログラムは以下のように組みました。 public int[] sortOfSort(int[] array) { int count_min = 0; int min = array[0]; for (int i = 0; i < array.length-1; i++) { // 最小値を求める if (min > array[i + 1]) { min = array[i + 1]; count_min++; // 最小値の配列のインデックスを確保 } } for (int k = count_min; k > 0; k--) { // 最小値の移動 int temp_min = array[k - 1]; array[k - 1] = array[k]; array[k] = temp_min; } int count_max = 0; int max = array[0]; for (int j = 0; j < array.length-1; j++) { // 最大値を求める if (max < array[j + 1]) { max = array[j + 1]; count_max++; // 最大値の配列のインデックスを確保 } } for (int l = count_max; l < array.length-1; l++) { //最大値の移動 int temp_max = array[l + 1]; array[l + 1] = array[l]; array[l] = temp_max; } return array; } 間違っているところがわかりましたら宜しくお願いします。

    • ベストアンサー
    • Java
  • 配列長参照のオーバーヘッド

    for等ループでループ終了条件に配列長を使用する場合、配列長を毎回参照する場合と一旦変数に格納して参照する場合、定数を使用する場合と処理速度の差はありますか? つまり 1、for( int i = 0; i < array.length; i++ ) { ... } 2、for( int i = 0; i < len; i++ ) { ... } *(int len=array.length) 3、for( int i = 0; i < 10; i++ ) { ... } *(int[] array = new int[10]) forループ内の処理のメモリ使用量の多寡は不明で、毎ループで読み取られる全ての変数はコンピュータのキャッシュに残るかどうかは不明だとします。

    • ベストアンサー
    • Java
  • 配列の値をループ

    よろしくお願いします。 例えば、$ary=array(1,2,3,4,5,6,7); という配列があるとします。この1,2,3,4,5,6,7の値を ループで表現することは可能でしょうか?? for文で試してみましたが、 $hoge="for($i=0;$i<7;$i++){ print $i; }"; $ary=array($hoge); 表示結果 for($i= でした。""で囲んだのでそのまま文字としてなったんだと 思います。""をはずすとエラーになります。 理想の表示結果は当然 1,2,3,4,5,6,7です。 行いたいことの意図はわかっていただけたでしょうか? 可能な場合、どういう記述をすればうまくいくのでしょうか? それとも不可能なのでしょうか?よろしくお願いします。 環境 php4.4.4 apache2 winXP

    • ベストアンサー
    • PHP
  • カウンタの値が変動するループ。

    ループの中で条件によってカウンタの元となる配列の項目を削除したいと 思っています。 具体的には list As List(Of string) For i As Integer = 0 To list.Count - 1 '条件によって、Listの項目を削除 If 条件 list.RemoveAt(i) End If Next 以上のようにすると、Listの項目が減っていくわけですが、iの値は 考慮していないので、いつかエラーが発生します。 カウンタの元となる値が変動した場合、再度その変動した値で最初から ループしなおすようにできないものでしょうか? (For以外のループを使えばいけるのかな…?) アドバイス宜しくお願いします。

  • forループを使うと上書きされてしまう・・・・

    NetBeansを使ってJAVAでツールを作っているのですが、 ループ作業でうまくいかないところがあります。 内容は テキストフィールドで入力された項目を、 全て別の画面で表示するというものです。 テキストフィールドを20個設置して、item配列をgetText()で作って それをforループで上から順番に表示しようとしているのですが、 結果を表示すると最後の一つしか表示されません。 ループが回る度に上書きされて最後しか残らないのだと思うのですが 全部表示する方法はないでしょうか? ↓ String[] item = new String[20];  //配列にまとめてます item[0] = item1.getText(); item[1] = item2.getText(); item[2] = item3.getText(); item[3] = item4.getText();  ・  ・省略  ・ item[18] = item19.getText(); item[19] = item20.getText(); for (int i=0; i<21; i++)        //ループで上から20項目表示しようとしてます items.setText(item[i] + "\n"); どんなことでもいいので情報をもらえると助かります。

    • ベストアンサー
    • Java
  • 配列の中に複数存在する数がいくつあるか

    お世話になります。配列の中に同じ数が存在する数がいくつあるかを調べたいのですが、途中でつまづいてしまいました。 例えば配列arrayの中に、0, 0, 5, 0, 5, 1, 5といった数が格納されているとしたら 複数ある数は0と5の2つなので、2を返す、というだけのプログラムです。 int n=array.length; int cnt=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(array[i]==array[j]){ cnt++; break; } } } return cnt; forループで配列0から同じ数を順番に調べ、もしヒットすればカウントを増やして内側のループをブレイクし、配列1からまた順番に調べようとしたのですが、 上の例の場合、配列0と配列1が同じ数(0)ですので、カウントが余計に増えてしまいます。 どのように組めばうまく動作するでしょうか。宜しくお願いします。

    • ベストアンサー
    • Java
  • ループ forに関して for($i = $num ; $i < $max ; $i++)

    phpの初心者です。 以下の記述ですが、上手にループしてくれません。 for($i = $num ; $i < $max ; $i++) $num の部分に「0」を入れると稼動するのですが、変数を代入したいというのが希望です。 方法があったらご教授下さい。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • ADFスキャンを両面でおこなってPCやクラウドに飛ばしたいのですが、本体側からもPC側からも設定の仕方が分かりません。
  • 片面か両面かを選択する方法が分からないため、お困りです。
  • Windows10を使用し、無線LANで接続しています。関連するソフト・アプリはありません。
回答を見る