C++ での 2D マップの操作

この記事では、C++ で 2 次元 (2D) マップを操作する方法を学習します。 C++ コード例を使用して概念を説明しました。

目次

  • はじめに - 2D マップとは
  • お申し込み
  • はじめに - 2D マップの宣言
  • キー/値の追加と更新
  • 値へのアクセス
  • キーと値のペアの消去
  • イニシャライザ リストを使用した 2D マップの初期化
  • 2D マップの繰り返し
  • 複雑さ

はじめに - 2D マップとは

基本的に、2 次元マップはマップのマップ、つまりネストされたマップです。これは、配列の配列である 2D 配列に似ています。

アプリケーション

この表は、2D マップがデータを格納する方法を示しています。 2D マップは、ネストされた情報がある場合に非常に役立ちます。たとえば、上の表では、各人に「名前」という識別子があり、いくつかのネストされた情報 (身長、体重、年齢) があります。

はじめに - 2D マップの宣言

2 次元マップを作成する構文は、1 次元マップを作成する構文と非常によく似ています。

以下は、int 型のキーと string 型の値を持つ 1 次元マップを作成するための構文です。

1D マップ

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, string> map1d;
}

2D マップ

以下は、2 次元マップを作成するための構文です。このマップのキーは int で、値はマップです。これらの内部マップには、string 型と int 値のキーがあります。

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
}

キー/値の追加と更新

キーを追加して値を更新するための構文は、1 次元配列の構文と非常に似ていますが、1 つではなく 2 つのキーを指定しています。

新しいキー (0) を map2D に追加し、内部マップのキー「キー」を 5 に設定するコードは次のとおりです。

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    map2d[0]["key"] = 5;
}

仕組みは次のとおりです。
map2d以降 2D マップ、map2d[0] キーは文字列で、値は int です。最初は map2d[0] 要素はありませんでしたが、キー "key" と値 5 を持つ要素を map2d[0] に追加しました .これで、map2d には 1 つの要素があり、キーは 0 で、値はマップです。

内側のマップに他の値を追加することもできます:

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    map2d[0]["key"] = 5;
    map2d[0]["new key"] = 10;
    map2d[1]["key"] = 15;
}

値を更新することもできます:

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    map2d[0]["key"] = 5;
    map2d[0]["key"] = 10; // Updates the value that was previously set
}

値へのアクセス

値の追加/更新に使用したのと同じ構文を使用して、2D マップの値にアクセスできます。

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    map2d[0]["key"] = 5;
    map2d[0]["key"] = 10;
    cout << map2d[0]["key"];
}

出力:
10

キーと値のペアの消去

内部マップ全体の消去

内部マップ全体を消去するのはかなり簡単です - erase を呼び出すだけです。 関数を呼び出して、消去したいキーを引数として渡します。

以下に例を示します:

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    map2d[0]["key"] = 5;
    
    map2d.erase(0); // There is no longer any value for the key 0.
}

これを実行した結果、内部マップ全体 (map2d のキー 0 の値) ) が消去されます。

内部マップで特定のキー/値を消去する

内部マップの特定のキー/値を消去するには (例:map2d[0] の「key」 )、最初に内側のマップにアクセスし、次に erase を呼び出す必要があります 関数。

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    map2d[0]["key"] = 5;
    
    map2d[0].erase("key"); // access map2d at key 0, 
    // then delete the key "key" from this inner map
}

初期化リストを使用した 2D マップの初期化

1 次元マップを作成する場合、次の形式を使用してマップを初期化できます:

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, string> map1d = {
        {0, "hello"},
        {1, "bye"}
    };
}

同様の方法で 2 次元マップを初期化できます。ただし、文字列の代わりに、値としてマップがあります。これらの各内部マップは、前のコード セグメントのマップと同じ形式です。

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d = {
        {0, {{"key", 5}, {"other", 10}}}, 
        {1, {{"key", 15}, {"other", 20}}}
    };

上記のコードは次のように書くのと同じです:

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    
    map2d[0]["key"] = 5;
    map2d[0]["other"] = 10;
    
    map2d[1]["key"] = 15;
    map2d[1]["other"] = 20;
}

2D マップの繰り返し

2D マップを反復するには、外側のマップと各内側のマップを反復する必要があります。したがって、ネストされた for ループを使用します。

#include <iostream>
#include <map>
using namespace std;

int main () {
    map<int, map<string, int>> map2d;
    map2d[0]["key"] = 5;
    map2d[0]["other"] = 10;
    
    map2d[1]["key"] = 15;
    map2d[1]["other"] = 20;

    for (auto outer = map2d.begin(); outer != map2d.end(); outer++) {
        // print the key
        cout << outer->first << "\n";
        //iterate through the value, which is a map
        auto inner_map = outer->second;
        for (auto inner_iterator = inner_map.begin(); inner_iterator != inner_map.end(); inner_iterator++) {
            cout << inner_iterator->first << ": "; //print the inner key
            cout << inner_iterator->second << " "; // print the inner value
        }
        cout << "\n";
    }
}

出力:

0
key: 5 other: 10 
1
key: 15 other: 20 

仕組みは次のとおりです。

マップをループするには、反復子を使用します。すべてのマップ反復子には first というメンバーがあります および second 、矢印演算子を使用してアクセスします (-> )。 first キーにアクセスするために使用され、 second マップ内の各要素の値にアクセスするために使用されます。

外側のループでは、outer というイテレータを使用しています。まず、cout << outer->first を使用して各要素のキーを出力します。 .次に、inner_map という新しい変数を作成して内部マップにアクセスします。 (auto として指定 簡単にするために)、それに値 outer->second を割り当てます .

次に、inner_map を繰り返す内部ループを作成します。 、 inner_iterator というイテレータを使用 .このループ内で、inner_iterator->first を使用して各キーと値を出力します。 と inner_iterator->second .

複雑さ

地図操作

マップ操作 (ルックアップ、更新など) の時間の複雑さは O(log(N)) です .

反復

各内部マップを反復するため、完全な反復の全体的な時間の複雑さは O(NM) です ここで、N は外側のマップのサイズ、M は内側のマップのサイズです。

結論

この記事は以上です。読んでいただければ幸いです。

質問

map2d が正しく宣言され、以下のすべてのオプションが期待どおりに実行されると仮定します。 "inner" と呼ばれる内部マップ キーの値を与えるオプションはどれですか?この内側のマップは、外側のマップの「テスト」キーに対応しています。

map2d["テスト"]["内部"]map2d["内部"]["テスト"]