No.2ベストアンサー
- 回答日時:
>まず、bilboさんのプログラムは動きませんでした。
>いろいろこちらで手直ししてみましたがやっぱりだめです
依然載せたプログラムは一応テストしたのですが...
int版で作ってみました.
今度はちゃんと通った事を確認しています.
>よく考えたら、こちらの開発環境を伝えてませんでした
僕の開発環境はUNIXのg++ですので,少し違うかも知れませんね.
このプログラムが動かなかった場合は,配列のi行目の最後の列のデータ
とi+1行目の最後の列のデータが,隣同士にあるかどうか確かめてください.
これはm行n列の配列Aに対して,A[i][n+5]という様なアクセスで,
A[i+1][5]をアクセスできるかどうかで確かめられると思います.
もしA[i][n-1]とA[i+1][0]が隣同士に無い様な開発環境ですと,
A[i]がA[i][0]~A[i][n-1]までの配列へのポインタになってること
が考えられます(配列でそんな環境があるかは疑問ですが).
そのような場合,この方法でソートするのはイタレータを
定義しなければならないのでややこしい事になります.
それから,これは分かっておられるかと思いますが,
ソートするデータを静的配列に入れないと,A[i][n-1]と
A[i+1][0]が隣り合わないので駄目です.
動的配列に入れるとコンパイルの時点ではねられると思います.
#include<algorithm>
#include<iostream>
#include<functional>
int main() {
int m[4][6];
for(int i = 0; i < 4; ++i)
for(int j = 0; j < 6; ++j)
m[i][j] = i+ j;
for(int i = 0; i < 4; ++i) {
copy(m[i], m[i]+6, ostream_iterator<int>(cout, " "));
cout << endl;
}
cout << endl;
sort(m[0], m[0]+24, less<int>());
for(int i = 0; i < 4; ++i) {
copy(m[i], m[i]+6, ostream_iterator<int>(cout, " "));
cout << endl;
}
return 0;
}
出力結果
0 1 2 3 4 5
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
0 1 1 2 2 2
3 3 3 3 4 4
4 4 5 5 5 5
6 6 6 7 7 8
この回答への補足
たびたび申し訳ないです。
コンパイラのエラー情報によると、
copyやostream_iteratorは「定義されていない識別子」だそうです。
UNIX CとWindowsではまったく違うものなのでしょうか?
No.1
- 回答日時:
2次元配列上のデータをソートするというのは、
どのような基準で並べ替えるということなのでしょうか?
(列数)*(行インデックス)+(列インデックス)
が大きくなる程、値が大きくなるようにソートしたいということでしょうか?
そうであると仮定して話を進めさせてもらいます。
又、bool operator>とsortを使えばいいというのは、
C++の標準テンプレートライブラリの、<algorithm>のsortを使って、
2次元配列をソートしたいということなのでしょうか?
そうであると仮定して話を進めさせてもらいます。
まず、operator>についてですが、配列に格納するデータに対して
このメンバ関数を定義する必要があります。ソートの基準のためです。
また、必ずしもoperator>を使わなくても、ソートの基準を決めてくれる
関数をsortに渡してやってもいいです。
辞書式順序といっておられるので、格納するデータは文字列でしょうか?
stringクラスにはoperator>が定義してあるので、stringクラスを
利用する場合でしたら必要ありません。
ここでは文字型の配列に文字列を入れている事にしましょう。
この場合、strcmpで比較する事になりますね。
例えば、次のようなコードになります。
#include<algorithm>
#include<iostream>
#include<cstring>
bool my_less(const char *str1, const char *str2) {
return (strcmp(str1, str2) < 0);
}
int main() {
char *a[4][6];
for(int i = 0; i < 4; ++i)
for(int j = 0; j < 6; ++j) {
a[i][j] = new char[4];
a[i][j][0] = 'a'+i*j;
a[i][j][1] = 'a'+j/(i+1);
a[i][j][2] = 'a'+j+i;
a[i][j][3] = '\0';
}
for(int i = 0; i < 4; ++i) {
for(int j = 0; j < 6; ++j)
cout << " " << a[i][j];
cout << endl;
}
cout << endl;
sort(a[0], a[0]+24, my_less);
for(int i = 0; i < 4; ++i) {
for(int j = 0; j < 6; ++j)
cout << " " << a[i][j];
cout << endl;
}
return 0;
}
この回答への補足
ご解答ありがとうございます。
まず、bilboさんのプログラムは動きませんでした。
いろいろこちらで手直ししてみましたがやっぱりだめです。
よく考えたら、こちらの開発環境を伝えてませんでした。
申し訳ないです。
MicrosoftVisualC++6.0になります。
あと何か必要なデータはありますか?
> (列数)*(行インデックス)+(列インデックス)が大きくなる程、
>値が大きくなるようにソートしたいということでしょうか?
そうです。
>C++の標準テンプレートライブラリの、<algorithm>のsortを使って、
>2次元配列をソートしたいということなのでしょうか?
これもそうです。
>格納するデータは文字列でしょうか?
数字です。すみません、忘れてました・・・
で、こちらでも調べて
lexicographical_compareとかいうのがあるらしいというので、
こんなプログラムを作ったのですが、やっぱり動きません。
八方ふさがりになってきました・・・
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
class data
{
int num1,num2;
public:
void setnum1(int i){num1=i;}
int getnum1() const {return num1;}
void setnum2(int j){num2=j;}
int getnum2() const {return num2;}
};
bool operator < (const data& a,const data& b){
returnlexicographical_compare(a.begin(),a.end(), b.begin(), b.end());
}
int main()
{
int i,k,l;
data dat;
vector<data> d;
cout << "数字を入力" << endl;
for(i=0;i<5;i++){
cin >> k;
cin >>l;
dat.setnum1(k);
dat.setnum2(l);
d.push_back(dat);
}
cout << "出力" << endl;
sort(d.begin(),d.end());
for(i=0;i<5;i++){
cout << d[i].getnum1() << " " << d[i].getnum2() << endl;
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の要素数に変数を入れたい...
-
関数から配列を返すには?
-
define で 配列
-
構造体のextern方法
-
C言語 数値の連続入力について
-
C言語 ファイルの指定された行...
-
クラスのデータメンバ?
-
C言語において、 配列要素をひ...
-
c言語
-
2番目の最大値を求める
-
C言語の2次元配列 容量が大き...
-
C#で構造体の配列を持った構造...
-
.NET C++で、構造体の配列をnew...
-
C言語の配列のコピーについて
-
c言語 構造体
-
配列のNULL初期化について
-
コンボボックスでデフォルト値...
-
int i, int i[1];
-
配列のアドレス部
-
[C++]const int と配列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報