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

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

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

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

Q&A

解決済

3回答

8129閲覧

配列の中身を個別に抜き出したい。C++

seri

総合スコア422

C++

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

0グッド

1クリップ

投稿2016/08/28 05:43

編集2016/08/28 05:47

配列の中身を、1つずつ抜き出す関数を作りたいのですが、方法がおもいつきません
具体的には、以下のようなものになります

C++

1 2void SET(){ int a[] = {1, 2, 3, 4};} 3 4void main(){ Scan(a);} 5 6void Scan(int[] a){ 7for(int i =0;i<a.size();i++){print a[i];} 8}

ここではPrintとしましたが、この配列aの中身をmainの中で1つずつ抜き出し、処理をさせるにはどのようにすればいいのでしょうか・・

わかりにくいと思うので理想のMain関数を書きます。

C++

1void main(){print Scan(a);}

関数Scanに配列を引数として渡してあげるだけで、配列の中身を個別に取り出してくれるような処理を考えています。

この場合はvoid Scanをprintとゆう処理にしましたが、あくまでも、Scan関数は配列の中身を返すだけの処理にしたいのです

つまり。。例えば、ほかにも、配列の中身をすべて2にする関数を作る場合は

C++

1void intsAll2(int[] a){ 2for(int i =0;i<a.size();i++){a[i]=2;} 3}

とゆう関数を作らなくてはいけません、しかし、私はMain内に処理内容を書きたいのです。

この希望を理解していただけたら、以下の、理想とする処理の意味が解っていただけると思います。

C++

1void SET(){ int a[] = {1, 2, 3, 4};} 2 3void main(){ 4print Scan(a); 5if(Scan(a)==2){print ok;} 6} 7 8void Scan(int[] a){ 9//? 10}

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

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

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

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

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

guest

回答3

0

エスパー回答を試みる:

C++

1#include <iostream> 2 3// cの各要素に対し関数fを適用する 4template<typename Container, typename Function> 5void scan(const Container& c, Function f) { 6 for ( const auto& value : c ) f(value); 7} 8 9int main() { 10 // 配列内の偶数がふたつであれば"OK" 11 int a[] = { 1, 2, 3, 4, 5 }; 12 int n = 0; 13 scan(a, [&](int v) { if ( v % 2 == 0 ) ++n; }); 14 if ( n == 2 ) { std::cout << "OK" << std::endl; } 15}

投稿2016/08/29 05:50

episteme

総合スコア16614

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

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

0

ベストアンサー

いまいちやりたい事のイメージが掴めないのですが、下記のようにしたいと言うことでしょうか?

C++

1#include <functional> 2#include <iostream> 3 4template <typename T, std::size_t N> 5void each(T (&array)[N], std::function<void(T &)> func) 6{ 7 for (T &x : array) { 8 func(x); 9 } 10} 11 12int main() 13{ 14 int a[] = {1, 2, 3, 4}; 15 each<int>(a, [](int &x) { std::cout << x << std::endl; }); 16 std::cout << "---- twice! ----" << std::endl; 17 each<int>(a, [](int &x) { x = x * 2; }); 18 each<int>(a, [](int &x) { std::cout << x << std::endl; }); 19 return 0; 20}

※ GCCとClangで動作確認していますが、C++11の機能を使っていますので、コンパイル時に"-std=c++11"等をつけてC++11以上でコンパイルしてください。Visual C++でも動作するかは未確認です。

投稿2016/08/28 06:50

編集2016/08/28 06:54
raccy

総合スコア21733

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

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

0

こんにちは。

C/C++の配列は、原則として要素数をハンドリングしてくれません。つまり、size()は存在しません。
ご希望のような処理を行いたい時は、std::vector<>を使うことをお勧めします。

ところで、理想の処理をvectorで書こうとしてみましたが、C++の文法には存在しない記述です。
print Scan(a);はなんでしょう? また、Scan()はvoidですのでその戻り値を2と比較できません。

投稿2016/08/28 06:22

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問