質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1059閲覧

C++のinitializerlistとfor文の扱いについて

temineko

総合スコア2

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/10/15 18:01

C++の勉強をしているものです。
string型の文字列が数値かどうかを判定するサンプルを見ていたところ、
見たことのないfor文の書き方をみて、少々混乱しています。
お力添えをお願いしたいです。

C++

1#include <iostream> 2#include <string> 3#include <map> 4 5using namespace std; 6 7bool isNumber(const string& str) 8{ 9 for (char const &c : str) { 10 if (std::isdigit(c) == 0) return false; 11 } 12 return true; 13} 14 15int main() { 16 string num; 17 cout << "整数の値を入力してください:" 18 cin >> num; 19 20 if(isNumber(num) != true){ 21 cout << "整数ではない"; 22 } 23 24 25 return 0; 26} 27

isNumberは入力された文字列が数値であれば、true、そうでなければfalseを返します。
まず、この関数の内部の
for (char const &c : str)
の書き方が初めて見るもので混乱しています。調べたところ、initializer listというものらしく、char const型
のポインタ変数cをstrの先頭アドレスで初期化しているものと考えてはいるのですが、まずこの認識はあっていますでしょうか。
その後、このcに関する変化式が省略されているのですが、省略された場合の変化式のデフォルトはこの場合、C++;となるであっていますでしょうか。

稚拙な文章で分かりずらく申し訳ありませんが、わかる方いらっしゃたらよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

range-based for と呼ばれる for 文の構文です。 コンテナ内の要素をひとつづつ取り出すというのは非常に頻出する典型的な for 文の用途であり、それを少し短く書けるように構文糖が用意されました。 begin で取り出したイテレータを回しながらそのイテレータを経由して取り出した要素を変数に代入 (または参照を束縛) するという手順を勝手にやってくれます。

言語仕様の定義通りに置き換えるとこの質問文の例における isNumber は以下のように書いた場合と同じとみなされます。 (ここで下線から始まる変数は便宜的にそう表現しただけで実際には決して衝突することのない名前になると考えてください。)

cpp

1bool isNumber(const string& str) { 2 { 3 auto && __range = str; 4 for ( auto __begin = begin(__range), 5 __end = end(__range); 6 __begin != __end; 7 ++__begin ) { 8 char const &c = *__begin; 9 if (std::isdigit(c) == 0) return false; 10 } 11 return true; 12}

char const &c の部分は通常の変数宣言として書いた場合とほぼ同じだと考えてよく、それをループ毎にやるわけですね。

質問文からは参照についても理解が不足しているように見受けられますので、そのあたりも見直すことをお勧めします。

投稿2021/10/15 19:07

SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

temineko

2021/10/16 14:39

ご回答ありがとうございました。理解できました。課題も提示していただき感謝しかないです。参照について勉強させていただきます。
guest

0

C++11で追加された、『範囲for文』と呼ばれるものです。

基本的には、
for(a:b)
の形で書くことにより、bの中の要素がループの度に一つずつ取り出されて、aの変数に入った状態でループが回ります。
C#やJavaの拡張for文と似たようなものです。

おそらく見慣れているイメージで書くとこんな感じです。(あくまでイメージです)

C++

1vector<int> b {1,2,3,4,5}; 2 3for(int i=0; i<b.size(); i++){ 4 int a = b[i]; 5  6 cout << a; 7}

これと同じ動作が以下の様に書けます。

C++

1vector<int> b {1,2,3,4,5}; 2 3for(int a : b){ 4 cout << a; 5}

ループの範囲を自動でチェックしてくれて、要素を取りだしてくれるので、要素一つ一つに対する操作を行うときには、表記がとてもスッキリします。

ただし、それが機能する条件として、bから繰り返しの範囲を取得できるものである必要があります。

&を付けると参照になって、元のリストの要素を書き換えることもできます。

範囲for文

投稿2021/10/15 18:59

amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

temineko

2021/10/16 14:42

ご丁寧な回答のみならず、勉強になるURLをつけていただきありがとうございます。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問