- ベストアンサー
qsortの関数
qsortで昇順や降順にする用に関数を書き換えたり出来ますが・・ linuxで言う[sort -u [ファイル名]]のように 同じ文字列を見つけたときに 同じ行を削除するにはどうしたらよいのでしょうか? たとえば qwer asdf zxcv tyui ghjk vbnm asdf zxcv とファイルがあったとすれば ソート後 重なっている asdf zxcv を一行にまとめて表示したいのです。 linuxコマンドで言うまさに sort -u です。この場合「-u」が普通のソートと違うところだと思っています。 qsortで指定する関数を書けばいいのでしょうか? 詳しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
qsort ではデータの個数は変化しないので, ソートしたあとで「前のデータと比較して, 違う場合に限って出力する」ことになるかと. ソートしたあとの処理を簡単に書くと char **p, **q; p = q = data; printf("%s\n", *p++); while (p < data + n) { if (strcmp(p, q)) { printf("%s\n", *p); } ++p; ++q; } って感じ.
その他の回答 (2)
- amru05
- ベストアンサー率63% (33/52)
C++ならばstlのsetを使用すると簡単に出来ます。 set:集合コンテナ。同じ物は1つしか入らない便利 データ保存用の入れ物??? <使い方> 1)文字列をset<string>のコンテナに全てinsertする 2)set<string>のコンテナから順にデータを取り出せばユニークな文字列になります。 <ソース例:書いただけで動かしていないので??> std::set<string> sdat ; sdat.insert(string("qwer") ; sdat.insert(string("asdf") ; sdat.insert(string("zxcv") ; sdat.insert(string("tyui") ; sdat.insert(string("ghjk") ; sdat.insert(string("vbnm") ; sdat.insert(string("asdf") ; sdat.insert(string("zxcv") ; std::set<string>::iteroter sit ; for (sit=sdat.begin();sit!=sdat.end();sit++) { cout << *sit << endl ; } とすると文字列が重なっていても、一度しか出てきません。 (PS) 以前なら、sort関数を自分で作成して、その後、出力する時に以前の文字と同じかチェックして同じなら、出力しないようにする。。。関数を作成していましたが、毎回同じような事をするのは意味が無いので、c++のstlを使用しています。 set/mapなどの使い方だけでも覚えると本当に便利ですよ。
- sakusaker7
- ベストアンサー率62% (800/1280)
qsortは並び替えをするだけですから、所望の動作をするには 配列を並び替える→ 配列を順に出力(このとき同じデータが連続していたら 最初のものだけ出力)のようにする必要があります。 sort hoge.xt | uniq のようなものです。sort -u は昔はありませんでした。