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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C++

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

Q&A

2回答

735閲覧

std::mapを使ってホスト名とIPアドレスの対応表

asuy

総合スコア0

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C++

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

0グッド

0クリップ

投稿2022/05/05 06:50

編集2022/05/05 07:18

ホスト名とIPアドレスの対応表を作りたい。こ
れを std ::map を使って実現してください。
• ホスト名からIPアドレスを引く機能,またその逆の,IPアドレ
スからホスト名を引く機能を実装してください。どちらも関数
になっていることが望ましいです。
↑これを教えてください。
C++
visual studio 2019使ってます

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

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

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

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

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

maisumakun

2022/05/05 07:16

どこまでコードを書いて、どのあたりで詰まっている感じでしょうか?
asuy

2022/05/05 07:25

対応表は作れたのですが、表からホスト名からIPアドレスを引く、またその逆の,IPアドレスからホスト名を引く機能が全く分からず書けていない状態です。 現段階のコード #include <iostream> #include <string> #include <map> int main(void) { std::map<std::string, std::string> taiou; std::string name; taiou["google"] = "216.58.197.164"; taiou["yahoo"] = "182.22.16.251"; for (auto n : taiou) { std::cout << n.first << ":" << n.second << std::endl; } int kensaku; std::cout << "ホスト名またはIPアドレスを入れて:"; std::cin >> kensaku; return 0; } こんな感じです。
dodox86

2022/05/06 05:02

「関数にする」以前にstd::mapの使い方を理解するのが先では。そうででないといただいた回答を消化できない。
YT0014

2022/05/06 11:57

タグObjective-Cはこの質問とは無関係ではないでしょうか? Objective-CとC++は、異なる言語です。
guest

回答2

0

まず、プログラミングってのは「こう書けばいい」というものではありません
ロジックを書き下すのです。

[元の問題] ホスト名とIPアドレスの対応表を作りたい。これを std ::map を使って実現してください。 • ホスト名からIPアドレスを引く機能,またその逆の,IPアドレスからホスト名を引く機能を実装してください。どちらも関数になっていることが望ましいです。

↓ 言い換え

[頼み] ホスト名とIPアドレスの対応表を作りたい。これを「ホスト名とIPアドレスのペア」を一つとして、これのリストを用意する。 そしてAさんがIPアドレスを言えば対応するホスト名、Aさんがホスト名を言えば対応するIPアドレスを教えていってくれ。

みたいな感じでしょうか。

私なら、

[対応表] google : 216.58.197.164 yahoo: 182.22.16.251 ...

みたいにする。ただ、上記の対応表は ホスト名: IPアドレス となっているけど、IPアドレスからホスト名を導き出す必要もある。どっちが渡されるかわからない。

で、上の対応表はホスト名がわかっている前提。ではIPアドレスがわかっていてホスト名がわからないときは?
同じようにIPアドレスをキーとして対応表を作る。でも今回はホスト名,IPアドレスの区別をしていないので

ホスト名 -> IPアドレス
IPアドレス -> ホスト名

のようにA,BとB,Aを区別して一つの対応表に書き込んでいく。そうすればキーだけを見ればわかる。

後はそれを組むだけ。

A,B と B,Aを区別するなら単純に { Host, IP } と、それを入れ替えた { IP, Host } のペアをstd::mapに入れるだけ。

もし GoogleとYahooを例にとっているのなら、Googleのペアの入れ替えも含めた 2通り( {Host,IP}, {IP, Host} )、Yahooも同様に2通り ( {Host,IP}, {IP, Host} )、つまり2 + 2 = 4通り のペアをstd::mapに入れるだけ。

そうすればmapのキーで取得すればいいですし。

もしどうしても {Host,IP} と {IP,Host⦆を同一視してコストを減らすのなら

1. キーに指定の文字列があるかどうか調べる 2. もし(1)に無いなら 2.1. 値をキーと見立てて(1)のように検索する

のようにしないといけないはずです。

今回の場合、first(= キー) と一致するならsecond(= 値)を値とする。second(= 値)と一致するならfirst(= キー)を値とする。みたいな感じで工夫する必要がある。

データ量はfirst,secondをそれぞれ見る方法が小さいけど、アルゴリズム的には若干面倒かも。
前者はキーから探せばいいけど、後者はキーと値をそれぞれ見ないといけないので。

投稿2022/05/05 09:38

BeatStar

総合スコア4958

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

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

0

taiou["google"] = "216.58.197.164";
taiou["yahoo"] = "182.22.16.251";

ついでに

taiou["216.58.197.164"] = "google";
taiou["182.22.16.251"] = "yahoo";

するんじゃダメですか?

投稿2022/05/05 07:29

episteme

総合スコア16614

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

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

asuy

2022/05/05 07:36

実行した際に両方表示されなければ大丈夫だと思います。
asuy

2022/05/05 07:38

google:216.58.197.164 yahoo:182.22.16.251 216.58.197.164:google 182.22.16.251:yahoo こう表示されなければ大丈夫です
episteme

2022/05/05 08:52 編集

つまりダメってことですか?
asuy

2022/05/05 08:28

上記のように表示されてしまうなら恐らく… 一応その場合のコードも教えてもらうことは可能でしょうか
episteme

2022/05/05 08:52

"一応"欲しいなら、まずあなたがコードを示すのがスジでは?
asuy

2022/05/05 09:05

教えてもらってる身として一応という言葉は不適切でした。すいません。どのコードを示せばいいのでしょうか。
episteme

2022/05/05 10:56 編集

「実行した際に両方表示されなないので大丈夫」なコードです。 # ところで僕が示した案は試してみたんでしょうね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問