• ベストアンサー

配列の配列の入れ替え処理(C/C++)

int a[5][2]とすると a[0][0] : 0 a[0][1] : 1 a[1][1] : 2 a[1][1] : 3 a[2][0] : 4 a[2][1] : 5 a[3][0] : 6 a[3][1] : 7 a[4][0] : 8 a[4][1] : 9 こういう形で領域が確保されるはずですが、この配列同士の入れ替えで困っています。 例えば、a[0]とa[4]を交換して a[0][0] : 8 a[0][1] : 9 a[1][1] : 2 a[1][1] : 3 a[2][0] : 4 a[2][1] : 5 a[3][0] : 6 a[3][1] : 7 a[4][0] : 0 a[4][1] : 1 となるようにしたいのです。 普通はスワップするときにテンポラリとして値を保持する物を確保しておくのですが、型がわからず困っています。 普通にint型どうしの入れ替えなら int tmp,a,b; tmp = a; a = b; b = a; とすれば良いのですが、上の配列の配列どうしの入れ替えでどう書けばいいかよくわかりません。自分で書くと「型が違うよ」と怒られてしまいました。 どう書けば入れ替えできるのでしょうか?

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

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

#include <cstdio> #include <algorithm> int main() {   int a[5][2] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };   std::swap_ranges(a[0], a[0]+2, a[4]); // ココ   for ( int x = 0; x < 5; ++x ) {    for ( int y = 0; y < 2; ++y ) {     std::printf("a[%d][%d] : %d\n", x, y, a[x][y]);    }   } }

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

その他の回答 (1)

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

なんだか他の言語とごっちゃになっていませんか? 少なくともコンパイラ言語っぽくないですね。 インタプリタ言語で何かと勘違いされていると思い ます。 C/C++は配列演算は無いでしょう。 int tmp[5][2],a[5][2],b[5][2]; が必要だし。 tmp=a; ではなくて、各要素ごとに代入する必要があります。

sirn
質問者

お礼

........ああ、確かに妙な勘違いをしているようですね....... 少し頭を整理してきます。

sirn
質問者

補足

int tmp,a,bの話は、配列でないint型のもの同士の入れ替えの話で、配列の話とは関係ありません。同じaが出てきてややこしいですが、配列のaとは全く関係有りません。読みにくくて申し訳ないですが....... int temp,a,b; temp = a ; a = b ; b = temp ; と書けばaとbの値は入れ替わりますが、配列の配列ではどうやるんだろうかという質問でした。 int a[5][2]と書くとa[0]にはa[0][0]へのポインタが入っているようですが.....

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

関連するQ&A

  • C の配列

    C で、配列 char a[8]; int b[8]; をメモリの連続した領域に配置し、 a[8] とすれば b[0] がアクセスできるようにしたいのですが可能でしょうか。

  • C++で、メンバもヒープに確保されていますか

    C++でどこまでヒープに確保されるのかが分からなくなる場合があります。 特に、配列がある場合や、クラスを使う場合newしてインスタンス作って使用する場合と、 そうでない場合があり、どこまでヒープ領域に確保されているのか 分からなくなってしまっています。 (開発環境 Visual Studio 2013等) Q1 クラス内の配列 class AA{ public: int x; int dat[10]; }; AA *a0 = new AA(); とする場合と AA a1; とする場合。 このとき、メンバ変数はそれぞれ、 a0->xはヒープ領域に確保 a1.xはスタック領域に確保 されるという理解で良いですか? そして、配列a0->dat[0]等 もヒープ領域に確保されていますか? Q2 クラス内にクラス class BB{ int u,v; AA aa; }; BB *b0 = new BB(); とした場合、 b0がヒープに確保されるとして、 b0->aaはヒープに確保されており、 b0->aa.xやb0->aa.dat[0]等もヒープに確保されているという ことで良いでしょうか? Q3 確認方法 変数等がヒープかスタック領域のどちらに確保されたかは どうやって見分けることができますか? アドレスの値から判断できますか? よろしくお願い致します。

  • 多次元配列の入れ替え

    いつもお世話になります。 PHPで多次元配列の入れ替えについて悩んでおります。 以下のようなデフォルトの配列から、整形後の配列 へ変換したいのですが、どのように扱ってよいか 頭が回らず困っています。 2次元目のクラスが等しいもののidをキーとして、 名前を値としたいのですが。。。 どうぞ宜しくお願いします(>へ<) //デフォルトの配列 Array (   [0] => Array     (       [id] => 1       [class] => A       [name] => 佐藤     )   [1] => Array     (       [id] => 2       [class] => A       [name] => 山下     )   [2] => Array     (       [id] => 3       [class] => B       [name] => 田中     )   [3] => Array     (       [id] => 4       [class] => B       [name] => 高橋     ) ) //整形後の配列 Array (   [A] => Array     (       [1] => 佐藤       [2] => 山下     )        [B] => Array     (       [3] => 田中       [4] => 高橋     )      )

    • ベストアンサー
    • PHP
  • C♯の配列について

    C♯でプログラムを作っているのですが、配列の要素数の最大値と最小値の求め方がわかりません。配列の値の最大値の求め方は調べれば出てくるのですが、要素数の最大値等は調べてもわかりませんでした。 例えば下記のような配列があった場合 int[,,] a =new int[100,100,100] a[2,3,6]=1 a[4,5,9]=1 a[13,46,79]=1 a[8,15,45]=1 a[1,33,68]=1 それぞれの要素数の最小値1、3、6、最大値13、46、79は どのようにプログラムで求めればいいのでしょうか? よろしくお願いします。

  • 配列の問題

    int a[256]; int b[256]; a[0]=1のとき,a[0]=b[1]のように,a[]の値をbの配列の[]の中に順に入れていくにはどのように書けばいいのでしょうか? お願いします.

  • C#で配列のフィールドを取得したい

    C#2.0を試用しています。 次のような書き方ではプリミティブ型は取得できるのですが、 配列のフィールドは取得できないので、 なんとかして取得する方法はないのでしょうか? public class MasterClass {  public int a = 2;  public int[] b = new int[] { 1, 2 };//←取得できない } Object obj = new TestClass(); Type type = obj.GetType(); foreach (FieldInfo fi in type.GetFields()) {  object tmp = fi.GetValue(obj);  Console.WriteLine(fi.Name + ":" + tmp); } System.Console.ReadLine();

  • 多元配列について(ANSI C)

    動的多元配列で、 Voidポインタに、多種の型がぶら下がった多元配列を作り、 読み書きをしたいのですがどのようにしたらよろしいでしょうか。 具体的には、 x[0][1]は、intで「2」が入っている x[0][4]は、intで「9」が入っている x[1][2]は、charでしかも文字列の配列で「goo」が入っている x[1][5]は、charでしかも文字列の配列で「教えて」が入っている x[0]は、int型の配列。X[1]は、文字列型の配列。 というようなものです。 一応ソースは作ってみたのですが、int型では問題なくいくのですが、 文字列は、コンパイルはできますが、実行すると予期せぬことが起きます。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) {      void **topPointa;      int * iDataInput;      int * iDataOutput ;      char * chDataInput;      char * chDataInput2;      char * chDataOutput1 ;      // ポインタアドレス用のメモリ確保      topPointa = (void *) calloc (10 , sizeof(void *));      if(topPointa == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      //int配列のメモリ確保      iDataInput = (int * ) calloc (10 , sizeof(int));      if(iDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      iDataInput[0] = 3 ;      iDataInput[1] = 4 ;      topPointa[0] = (void * ) &iDataInput;      //int配列の取り出し      iDataOutput = *(int *) topPointa[0];      printf( "int: %d\n", iDataOutput[0] );      printf( "int: %d\n", iDataOutput[1] );      //char配列 のメモリ確保      chDataInput = (char * ) calloc (10 , sizeof(char *));      if(chDataInput == NULL) {           printf("メモリが確保できません\n");           exit(-1);      }      chDataInput2 = (char * ) calloc (10 , sizeof(char));      if(chDataInput2 == NULL) {           printf("メモリが確保できません\n");           exit(-1);       }      strcpy(chDataInput2 , "hoe");      chDataInput[0] = &chDataInput2;      topPointa[1] = (void * ) &chDataInput;      //char配列の取り出し      chDataOutput1 = *(char *) topPointa[1];      printf( "char: %S\n", chDataOutput1[0] );      free(iDataInput);      free(chDataInput);      free(chDataInput2);      return 0; } 言語は、C言語ANCI Cでお願いします。 以上。よろしくお願いします。

  • C言語の配列のコピーについて質問です。

    intを要素とする二つの配列a、bとその配列の要素数を受け取り、配列aのすべての要素の値を配列bにコピーする関数を定義し、その関数の機能を確認するプログラム作成するという問題について質問です。 (1)配列aを配列bに「先頭から順番に」コピーする関数を作成する (2)配列aを配列bに「後ろから順番に」コピーする関数を作成する ただし、配列の要素数(例では4)が変更されても処理できる関数を作成したいです。また、配列の要素の値は関数main()内で表示したいです。 [ヒント] (1)関数宣言の例 void array_copy(コピー元の配列, コピー先の配列, 配列の要素数) [実行結果の例] (1)先頭から順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 1 a[1]: 2 b[1]: 2 a[2]: 3 b[2]: 3 a[3]: 4 b[3]: 4 (2)後ろから順番にコピーする コピー前 a[0]: 1 b[0]: 0 a[1]: 2 b[1]: 0 a[2]: 3 b[2]: 0 a[3]: 4 b[3]: 0 コピー後 a[0]: 1 b[0]: 4 a[1]: 2 b[1]: 3 a[2]: 3 b[2]: 2 a[3]: 4 b[3]: 1 #include <stdio.h> void array_copy() から始めて int main(void) { とプログラムを作成したいのですが教えてください。

  • 配列について

    int a[100][100][100] と定義した場合にエラーが出るのですが100を変えずに配列を確保するにはどうしたらいいでしょうか?

  • 配列

    public void test(int[] x){ ... } というメソッドに配列を渡したいとき、 test(new int[5]); は可能ですが、 int[] a = {0,1,2,1,0} という書式が可能なことから、 test( {0,1,2,1,0} ); としてみたのですが、コンパイルでひっかかります。 {}による配列生成は初期化のみに限定されているのでしょうか。 値の入った配列をこのtestに入れてやりたい場合は、 int[] a = {0,1,2,1,0}; test(a); としていかないといけないのでしょうか。

    • ベストアンサー
    • Java
Wi-Fiの再設定が出来ない
このQ&Aのポイント
  • パスワード変更後にWi-Fi経由での印刷ができない問題について相談します。
  • 新しいWi-Fiルーターへのパスワード登録後、iPhoneやPCからプリントできない問題について詳しく教えてください。
  • Windows10のPCとiPhone/iPadで無線LANを利用している際に、Wi-Fi経由での印刷ができない問題が発生しています。
回答を見る