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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

3回答

2775閲覧

C言語にC++のmapを作成するには何が必要でしょうか?

whitehorse85921

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2021/07/14 10:13

前提・実現したいこと

Paizaの「レベルアップ問題集」の「Bランクレベルアップメニュー」での解答にC++のmapを使った解答が乗っていたのですが、C言語でmapを作成することは可能でしょうか?また作成するにはどんな知識が必要でしょうか?
C言語で私が解いた回答は60点で100点には届きませんでした。
https://paiza.jp/works/mondai/prob60/sort_add_9

発生している問題・エラーメッセージ

エラーメッセージはございません。

該当のソースコード

C++

1#include <iostream> 2#include <map> 3#include <vector> 4#include <algorithm> 5using namespace std; 6 7int main() { 8 int n; 9 cin >> n; 10 map<string, int> SD; 11 for (int i = 0; i < n; ++i) { 12 string s; 13 int d; 14 cin >> s >> d; 15 SD[s] += d; 16 } 17vector<pair<int, string>> DS; 18 for (auto iter = SD.begin(); iter != SD.end(); ++iter) { 19 DS.push_back(make_pair(iter->second, iter->first)); 20 } 21 sort(DS.begin(), DS.end(), greater<pair<int,string>>()); 22 for (int i = 0; i < DS.size(); ++i) { 23 cout << DS[i].second << ' ' << DS[i].first << endl; 24 } 25}

C

1#include <stdio.h> 2#include <string.h> 3 4#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0) 5 6int main(void) 7{ 8 int n; 9 scanf("%d", &n); 10 11 12 char s[20][n]; 13 int d[n]; 14 for (int i = 0; i < n; i++) { 15 scanf("%s%d", s[i], &d[i]); 16 //printf("%s %d\n", s[i], d[i]); 17 } 18 //printf("\n"); 19 20 int d_ans[n]; 21 char s_ans[20][n]; 22 int now = 0; 23 24 for (int i = 0; i < n; i++) { 25 for (int j = 0; j < n; j++) { 26 if (i != j && strcmp(s[i], s[j]) == 0) { 27 d_ans[j] = d[i] + d[j]; 28 strcpy(s_ans[j], s[j]); 29 now++; 30 } else if (j && strcmp(s[i], s[j]) != 0) { 31 d_ans[j] = d[j]; 32 strcpy(s_ans[j], s[j]); 33 } else { 34 d_ans[i] = d[i]; 35 strcpy(s_ans[i], s[i]); 36 } 37 } 38 } 39 40 for (int i = 0; i < n - now/2; i++) { 41 for (int j = n - now/2 - 1; j > i; j--) { 42 if (d_ans[j - 1] < d_ans[j]) { 43 swap(int, d_ans[j - 1], d_ans[j]); 44 char t[20]; 45 strcpy(t, s_ans[j - 1]); 46 strcpy(s_ans[j - 1], s_ans[j]); 47 strcpy(s_ans[j], t); 48 } 49 } 50 } 51 52 //printf("%d\n", n - now/2); 53 for (int i = 0; i < n - now/2; i++) { 54 printf("%s %d\n", s_ans[i], d_ans[i]); 55 } 56 57 return 0; 58 59} 60

試したこと

C言語の初心者なのでhash法をどのように改造したらよいか分かりませんでした。

補足情報(FW/ツールのバージョンなど)

piaza.ioを使用。

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

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

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

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

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

BeatStar

2021/07/14 10:54

できなくはないと思いますが、リスト構造とかみたいに大掛かりになると思いますよ。 単に似たような実装であれば『構造体』にするだけです。
dodox86

2021/07/14 11:10

C++のstd::mapの性能にどこまで迫るかで難易度が全然違うのではないでしょうか。 単に(キー/値)のペア、それも最大件数がそれほど多くなく、決まっているなら簡単でしょうけど、ちゃんとやろうとすると様々な背景知識が必要なはずです。単なる(キー/値)のペアだと検索の速度がO(N)になりますが、ちゃんと実装するとO(log N)に迫るはずです。 https://atcoder.jp/contests/apg4b/tasks/APG4b_aa?lang=ja
whitehorse85921

2021/07/14 14:13

BeatStar様、ありがとうございます。 私のようなC言語初心者にはまだ実装できないと思いました。私の実力で構造体で実装できるか分かりませんが試してみたいと思います。
whitehorse85921

2021/07/14 14:16

dodox86様、ありがとうございます。 様々な背景知識が必要とあったので、今の私には到底できそうにないなと思いました。もう少し修行を積んでからチャレンジしたいと思います。
actorbug

2021/07/14 14:35

質問とは関係ありませんが、C言語の回答で正常動作しない入力例を挙げておきます。 3 A 1 A 2 B 4 また、入力が20行を超えた際にも正常動作しなくなると思われます。
whitehorse85921

2021/07/14 14:38

actorbug様、ありがとうございます。 実は入力が8行を超えるのも正常に動作しませんでした。
kazuma-s

2021/07/14 15:49

その Paiza の問題の解答を C で書きたいのなら、C独自のコードを 書くことで質問にある C++ のコードと同程度の行数で書けます。 map を使わなくてもよいから、Cでどう書けばよいのか知りたければ そのことを質問に追記してください。
dodox86

2021/07/14 23:53

質問の主旨はもともと「C++のstd::mapをC言語で作るには?」ですし、そのことについて既に複数の回答もいただいているので、自分なりの結論を得られたらBAを挙げていったんは質問をクローズすべきかと思います。テーマが変わるなら新規に別の質問で。
whitehorse85921

2021/07/15 20:32

kazuma-s様、ありがとうございます。 「C独自のコードを書くことで質問にある C++ のコードと同程度の行数で書けます。」と教えて頂きありがとうございます。テーマが変わりますので新規の質問でやりたいと思います。
whitehorse85921

2021/07/15 20:34

dodox86様、ありがとうございます。 BAを挙げて質問をクローズいたします。mapをC言語では今の私に出来そうにないので、別の質問を立てたいと思います。
guest

回答3

0

ベストアンサー

まず、2次元配列の使い方が奇妙なので復習したほうがよいでしょう。

次に、この問題はS_i1つの半角英文字なので26種だか52種だかは知りませんが256種は超えません
よって最初に256個のint配列を2個用意しカウントおよび出現したかを計測してやるだけです。

最後にどうしてもmapがほしければ赤黒木もしくはハッシュテーブルを実装する事になり
アルゴリズムとデータ構造について勉強する必要があります。

正直ファイル分割ができない競プロでやりたくないですし
勉強した結果uthashなどのヘッダライブラリを使う事になる気もします


よく考えるとソートの際に面倒くさいので構造体の方が楽でしたが
入力は以下のような感じ

c

1struct { 2 char ch; 3 int count; 4} data[255] = {}; 5 6for(int i = 0; i < n; i++){ 7 char ch; 8 int d; 9 scanf("%c %d", &ch, &d); 10 data[ch].ch = ch; 11 data[ch].count += d; 12}

投稿2021/07/14 12:52

編集2021/07/14 16:05
asm

総合スコア15147

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

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

whitehorse85921

2021/07/14 14:24

asm様、ありがとうございます。 「最初に256個のint配列を2個用意しカウントおよび出現したかを計測してやるだけです。」と折角おっしゃって下さったのに理解が出来ずすみません。 どんな実装になるのか今の私には想像がつきません。 アルゴリズムとデータ構造も少しずつ勉強したいと思います。
whitehorse85921

2021/07/15 20:38

asm様、ありがとうございます。 コードのご提示ありがとうございます。ご提示いただいたコードを基に解いてみたいと思います。
guest

0

C言語でmapを作成することは可能でしょうか?また作成するにはどんな知識が必要でしょうか?

Mapって、ぶっちゃけ対応表/辞書もっと言えば電話帳です、名前から電話番号を引き当てるってゆー。
だからたとえば「名前から電話番号を引き当てる」のを目的とするなら:

C

1struct record { 2 char name[32]; 3 char phone[15]; 4}; 5 6struct record Phonebook[100]; // 100人分の電話帳

とかやっといて、電話帳に挿入/削除/検索の機能を実装すればいい。

※ もちろん 登録数を(100じゃなく)可変にしたいとか、高速に検索したいとか、要件に応じて
もっと凝ったつくりにする必要があるでしょうよ(ハッシュ表による電話帳とかね)。

投稿2021/07/14 11:40

episteme

総合スコア16614

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

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

whitehorse85921

2021/07/14 14:27

episteme様、ありがとうございます。 構造体で電話帳を作る場合登録数を可変に出来るの知りませんでした。ハッシュ表による電話帳は実装が難しそうです。
guest

0

作成しようとする C++ の Map の知識と、 C の知識だと思います。

投稿2021/07/14 10:52

jimbe

総合スコア12754

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

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

whitehorse85921

2021/07/14 14:29

jimbe様、ありがとうございます。 C++のmapの知識とCの知識両方必要なのですね。今はCだけでいっぱいいっぱいですが、いずれ積み上げたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問