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

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

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

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

Q&A

解決済

3回答

3122閲覧

C++のstd::mapの値が重複している場合

09logic

総合スコア15

C++

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

0グッド

0クリップ

投稿2017/10/05 03:20

こんにちは。
ちょっとお力をいただきたいのですが、
以下のような、キーは違うのに、値が一緒のmapがあるとします。

static const std::map<int, const char*> test_map = {
{ 100, "hoge" },
{ 200, "hoge" },
{ 300, "hoge" }
};

上記のキーを一つにまとめたいのですが、何かいい方法とかないでしょうか…

static const std::map<int, const char*> test_map = {
{ 100-300, "hoge" }, // こんな感じでキーを一つにまとめたい
};

int main(){
auto it = test_map.find(200);
it->second; // "hoge"
return;
}

以上です。どうかよろしくお願いします。

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

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

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

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

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

guest

回答3

0

hoge"等の値をstd::setへ保存し...

やってみた。

C++

1#include <set> 2#include <string> 3 4class symbol { 5public: 6 symbol(const std::string& str) { 7 iter_ = s_.insert(str).first; 8 } 9 10 const std::string& str() const { 11 return *iter_; 12 } 13 14 const char* c_str() const { 15 return iter_->c_str(); 16 } 17 18private: 19 20 static std::set<std::string> s_; 21 std::set<std::string>::const_iterator iter_; 22}; 23 24std::set<std::string> symbol::s_; 25 26// おためし 27#include <iostream> 28 29int main() { 30 using namespace std; 31 const char* hello1 = symbol("hello").c_str(); 32 const char* hello2 = symbol(string("he")+"llo").c_str(); 33 // 等しい文字列には *同一*のインスタンスを返す。 34 if ( hello1 == hello2 ) cout << "ok." << endl; 35}

投稿2017/10/05 03:58

episteme

総合スコア16614

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

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

0

こんにちは。

キーをまとめるのは特殊な用途ですのでSTLでは対応できないと思います。
「値」の重複を避けることが目的であれば、hoge"等の値をstd::setへ保存し、そのstd::setのイテレータをstd::mapの値とすることは考えられると思います。

投稿2017/10/05 03:36

Chironian

総合スコア23272

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

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

09logic

2017/10/05 03:50

やはりできませんか…。 何となく無理だろうな、とは思っていたので…。 ご回答ありがとうございました。
yumetodo

2017/10/05 03:51

>std::setのイテレータ それイテレータが無効になるやつでは・・・
Chironian

2017/10/05 04:43 編集

setはツリー管理しますし、vectorのように再獲得しないから無効にはならないと思うのですけど、無効になるのでしたっけ?
Chironian

2017/10/05 05:27

yohhoyさん、ありがとうございます。 「std::vectorのようなランダムアクセスが高速が売り」ではないコンテナは原理的にinsertで破壊する必要がない筈なので、それを確認できて助かりました。 yumetodoさんのリンク先はmapはinsertでも破壊されると書いてますね。 もしかして、そのような処理系があるのでしょうか? msvcとか有り得そうでちょっと怖い。
yumetodo

2017/10/05 05:51

規格的には問題ないと、そりゃそうだよなぁ・・・。これは壊れる処理系探しが始まる・・・?
guest

0

ベストアンサー

上記のキーを一つにまとめたい

まとめることによるメリットが見いだせませんが(検索コスト上がる)・・・。省メモリーにしたいなら、一度std::unorderd_set<std::shard_ptr<ValueType>>に入れて、shard_ptrを値にするべきです。

投稿2017/10/05 03:29

yumetodo

総合スコア5850

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

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

09logic

2017/10/05 03:50

ですよね、コストがあがりますよね。 shard_ptr、一度検討してみます。 ご回答ありがとうございました。
yumetodo

2017/10/05 03:53

std::hashの特殊化が必要なことをお忘れなく
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問