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

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

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

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

Q&A

1回答

479閲覧

C++のunordered_mapによるハッシュ連想配列

syachi

総合スコア3

C++

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

0グッド

0クリップ

投稿2022/04/21 08:37

C++のハッシュ連想配列クラスunordered_mapについての質問です。
IPアドレスとホスト名の対応を標準入力から読み、コマンドライン引数に指定したホスト名に対応するIPアドレスを出力したいのですが、指定したホスト名に対応するIPアドレスだけを出力するコードが分かりません。

テキストファイルに
127.0.0.1 localhost
::1 ip6-localhost
10.30.5.1 ehime.sun.ac.jp
と書き、
./a/out  ehime.sun.ac.jp < test.txt
と打つと
10.30.5.1
と表示されるようにしたいです。

今の段階で書いているコードは以下の通りです。
#include<iostream>
#include<string>
#include<boost/algorithm/string.hpp>
#include<boost/tokenizer.hpp>
#include<unordered_map>

using namespace std;
using namespace boost;

typedef char_separator<char> CHAR_SEPARATOR;
typedef tokenizer<CHAR_SEPARATOR> TOKENIZER;

int main(int argc, char *argv[]) {
unordered_map<string, string>histogram;
string line;

CHAR_SEPARATOR separator(" ");

while(getline(cin, line)){
TOKENIZER tokens(line, separator);
for (auto token = tokens.begin(); token != tokens.end() ;token++) histogram[*tokens.begin()]=*tokens.end() ;
}

for (auto i = histogram.begin(); i !=histogram.end(); i++)
cout << i->first<<endl ;
return 0;
}

回答よろしくお願いします。

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

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

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

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

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

int32_t

2022/04/21 08:49

現状のコードで、最後のforループで期待される結果が表示されてますか?
syachi

2022/04/21 09:30

表示されていません。 最後のfor文をif文に変えて目的のhistogram.beginを出力するように書いたらよいと思ったのですが。
int32_t

2022/04/21 09:39

すいみません、そういう意味ではなくて、最後のforループで何が表示されますか? histogramにすべてのデータが入っていることは確認できましたか? あと、unordered_map のメンバ関数一覧を眺めても何をすればいいか見つけられませんか? https://cpprefjp.github.io/reference/unordered_map/unordered_map.html
syachi

2022/04/21 10:00

中止(コアダンプ)と表示されています。 operator[]を使うと良いのでしょうか?
int32_t

2022/04/21 23:31

unorderd_map にデータを入れる処理はどうしても必要なので、まずは現状のコードがまともに動くようにしましょう。 > 中止(コアダンプ)と表示されています。 では、そこを直してください。 たぶん *tokens.end() が原因です。end() のイテレータを * でデリファレンスするのは常に間違いです。end() は範囲外を意味するイテレータなので。
guest

回答1

0

C++

1#include <iostream> 2#include <sstream> 3#include <string> 4#include <unordered_map> 5 6int main(int argc, char *argv[]) { 7 using namespace std; 8 9 unordered_map<string, string> dic; 10 string line; 11 while ( getline(cin, line) ) { 12 istringstream stream(line); 13 string ip; 14 string host; 15 stream >> ip >> host; 16 dic[host] = ip; 17 } 18 19 for ( const auto& item : dic ) { 20 cout << item.first << " : " << item.second << endl; 21 } 22 cout << endl << "------ search result ------" << endl; 23 24 auto iter = dic.find(argv[1]); 25 if ( iter != dic.end() ) { 26 cout << iter->first << " -> " << iter->second << endl; 27 } else { 28 cout << "sorry, " << argv[1] << " unknown." << endl; 29 } 30}

投稿2022/04/21 23:59

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問