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

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

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

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

Q&A

解決済

2回答

2253閲覧

1対1で対応するコンテナクラスが欲しい

Watching

総合スコア56

C++

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

0グッド

0クリップ

投稿2020/09/25 03:09

編集2020/09/25 03:13

二つの要素が存在するコンテナで、互いの要素でもう片方を検索できるようなものが欲しい。
mapを使うと、keyからvalueを検索するのは簡単だが、valueからkeyを探すのは難しい。ここで、valueも重複不可で、valueから(この場合valueというのはおかしいが)keyを簡単に検索できるようなコンテナを探しています。

例えば、{0,"zero"},{1,"one"},{2,"two"},{3,"three"}...というような要素が存在していたとして、数字の入力に対して文字列の出力、文字列の入力に対して数字の出力がしたいです。

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

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

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

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

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

mjk

2020/09/25 03:34

>>コンテナを探しています。 そんなコンテナはSTLには無いと思いますので自作するしか無いと思います。 どういう用途で使うのか何かの問題なのかなどの要件が不明なので的はずれなことかもしれませんが・・・ 一例としてmap2つ実装するだけで事足りそうかなと思ったのが直感です。 map1 {0,"zero"},{1,"one"} map2 {"zero",0},{"one",1}
Watching

2020/09/25 03:43

二つ用意することは容易ですが(激ウマギャグ)、要素を書き換えたくなった時に間違えが起こりそうだな、と。
mjk

2020/09/25 03:50

二つ用意することは容易でしょうから待っていれば心優しい方が丸投げコピペするだけで動く関数なり構造体なりコンテナっぽいもののコード書いて回答してくれるかもしれませんね。 頑張って待っていてください。
Watching

2020/09/25 04:09

あるかどうか聞きたかっただけなのになんでそんな言い方されないといけないんですか。
Soei

2020/09/25 15:00

STL外でもいいなら、Boostのbimapはいかがでしょうか。 使ったことはないので詳しくは知りませんが。
guest

回答2

0

ベストアンサー

こんにちは。

STLにはないと思います。探せばどこかに転がっていそうな気もしますが、そんなに巨大なものにはならないので作ってしまうのも手と思います。(依存ライブラリが増えるとライセンス管理やバージョンアップ管理など結構管理の手間も増えますし。)

一般には検索キーは1つだけですが、それを複数(今回の場合は2つ)設けたいという問題に帰着できると思います。例えば、以下のようなBaseを継承したクラスの中でAdditionaKeyメンバー変数を定義し、必要なコードを追加すると比較的楽だろうと思います。

typedef std::map<Key, Value> Base; typedef std::map<Value, Base::iterator> AdditionaKey;

投稿2020/09/25 04:41

Chironian

総合スコア23272

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

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

Watching

2020/09/26 01:02

ありがとうございます。 結局、値と対応する値のアドレスが入っているmapを二つ用意することでどちらから検索しても高速検索できるコンテナを作ることにしました。
guest

0

map<int,string> kv_map と map<string,int> vk_map の両方を用意するんじゃダメですか?

高速検索を求めないなら vector<pair<int,string>> ひとつでもいいけど。

投稿2020/09/25 03:33

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問