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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

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

Q&A

解決済

3回答

1255閲覧

JSの連想配列はC++で実現できないのだろうか

Kota.Y

総合スコア25

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

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

0グッド

1クリップ

投稿2020/06/06 13:29

JavaScriptでは

javascript

1const obj = { 2 "M" : 45, 3 "T" : 15, 4 "S" : 64, 5 "H" : 31, 6 "R" : 2 7}

このように連想配列を定義することができ、尚且つ

javascript

1for(let i in obj){ 2 console.log(obj[i]) 3} 4//=> 45 5//=> 15 6//=> 64 7//=> 31 8//=> 2

このようにイテレートすることで定義した順に出力することができます。このノリでC++のmapを使い

c++

1map<string,string> obj{ 2 {"M", 45}, 3 {"T", 15}, 4 {"S", 64}, 5 {"H", 31}, 6 {"R", 2}, 7}

と定義し、同じようにイテレートすれば定義順に出ると思いきや

c++

1for (const auto &[key, value] : names){ 2 cout << value << endl; 3} 4//=> 31 5//=> 45 6//=> 2 7//=> 64 8//=> 15

このように勝手に第一引数でソートされてしまいます。
C++でJavaScriptのオブジェクトのような挙動をする連想配列の作り方をどなたか教えてください。

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

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

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

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

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

guest

回答3

0

イテレートすることで定義した順に出力することができます。

そうではありません。

  • 古い実装では、イテレートの順序は保証されていません。
  • ES2020で定義された順序でも、負でない整数のキーは最初に来て数字順に並ぶことになっています。

投稿2020/06/06 14:02

編集2020/06/06 14:06
maisumakun

総合スコア145952

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

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

0

このように勝手に第一引数でソートされてしまいます。

仕様です。C++のstd::mapはキー昇順で要素ソートされます(デフォルト動作では)。

Boost.MultiIndexライブラリを利用すれば、「挿入順で要素イテレート(挿入順序を保持)」「連想配列のようにキー値でアクセス」の両方を満たすことは可能です。
Demo: https://wandbox.org/permlink/qMiZ8ck14UgxBS3M

c++

1namespace bmi = boost::multi_index; 2 3template <typename K, typename V> 4using jslike_map = bmi::multi_index_container< 5 std::pair<const K, V>, 6 bmi::indexed_by< 7 bmi::sequenced<>, 8 bmi::hashed_unique<bmi::member<std::pair<const K, V>, const K, &std::pair<const K, V>::first>> 9 > 10>; 11 12int main() 13{ 14 jslike_map<std::string, int> names { 15 {"M", 45}, 16 {"T", 15}, 17 {"S", 64}, 18 {"H", 31}, 19 {"R", 2} 20 }; 21 22 names.push_back({"X", 100}); 23 24 for (const auto &[key, value] : names) { 25 std::cout << value << std::endl; 26 } 27 28 auto itr = bmi::get<1>(names).find("S"); 29 std::cout << "names[S]=" << itr->second << std::endl; 30}

投稿2020/06/06 15:01

yohhoy

総合スコア6191

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

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

0

ベストアンサー

残念ながらmap型ではソート時にKeyでソートされてしまいます。
ただ、それと似たもので、tupleというものがあります。
tupleは、一つの要素内に何個もの要素を格納できます。
また、これをvectorに入れることで、map型のような挙動をします
宣言は、

C++

1tuple<char,int> a; //char型,int型のtuple 2tuple<int,int,int> b; //int型,int型,int型のtuple 3vector<tuple<char,int>> c; //char型,int型のtupleの配列(=map)

このようにでき、cに要素を追加するには、

C++

1c.push_back(make_tuple((char型の変数),(int型の変数)));

このようにします。参照は、

C++

1get<(何番目の要素か)>(対象のtuple); 2 3//example 4tuple<char,int>a; 5a=make_tuple('a',1); 6cout<<get<0>(a); //'a' 7cout<<get<1>(a); //1

このようにできます。
詳細はここにあります。
※std:: は省略しています

投稿2020/06/06 13:40

編集2020/06/06 13:46
Luke02561

総合スコア404

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

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

Kota.Y

2020/06/06 22:57

vectorにtupleを格納することで解決しました!ありがとうございます。 C++は奥が深いですね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問