C++ std::mapコンテナ

std-map.png

重複をカウントする

初期化

map<int,string> mymap;

constにしたいときは、要素をconstにしたらいいかな。このように

map<const int,const string>

要素の初期化

parameters.insert("レーダ反射因子","RZH0");//C2440エラー
parameters.insert(map<string,string>::value_type("レーダ反射因子","RZH0"));//ok!
parameters.insert(pair<string,string>("レーダ反射因子","RZH0"));//こっちのほうが短いぞ
parameters["レーダ反射因子"]="RZH0";//いきなりこうやってもいいらしい。
  • もし存在しないキーを指定してアクセスした場合には、そのキーを自動的に登録する。
  • そのキーに対応する値は、その値の型のデフォルトコンストラクタによって初期化される。

const mapを作る用途ならば、こんな初期化の仕方が用途にあってそう[1]

insertによる登録

  • insertで登録したら、ペアを返してくれる。

値を登録するには

std::map<std::string, int> mp;    //  文字列 → 整数 の連想配列
mp["abc"] = 123;

キーから値を探すには[]

値=map["キー"];

走査する方法

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int main(int argc, char const* argv[])
{
    map<string, int> m = {
        { "foo",1 },
        { "bar",2 },
    };
    for_each(m.begin(), m.end(), [](auto p) {cout << "key = " << p.first <<" val = "<<p.second<< endl; });
    //これでもok
    for(auto pair:m){
    cout << pair.first << " " << pair.second << endl;
         }
    return 0;
}

自作オブジェクトをキーにするには(未解決)

必要なもの

  • 比較関数オブジェクト
  • デフォルトコンストラクタ
  • コピーコンストラクタとoperator=
  • デストラクタ

operator<は書かないとコンパイルが通らないが、
その他のやつは、書かないと空の関数が勝手に書かれた状態になってしまう。
もしoperator<を書きたくなかったらunordered_mapの方を使おう。

operator<の書き方

     bool    operator<(const Miffy& _in)const{
     if((x<_in.x) ||(y<_in.y)||(z<_in.z)){return true;}
      return false;
    }

orにすることが大事。
最初andで実装してたら、同じ値なのに重複だと判定されず、超雑な仕分けがわれてしまった。
なぜだかよくわからないけど。
* 同じ値だった場合はfalseを返さなければならない。
invalid-operator-while-sorting-stdlist
結局うまくいってない。vec3<T>みたいに、はっきりと大小決まってないものは困る。
ノルムにする手もあるけど、、、同じノルムでも違う要素のがありうるからなぁ。
ということで、とりあえず妥協策として、文字列にしようかなぁ。

悩み

自作オブジェクトをキーにした時、
違うキーなのに勝手に同じキーにされてる(TT)
operator<がらみの問題だが未解決

secondの要素を連番にしたい。

mapのsecondの要素を連番にしたいを参考に

Bibliography
2. std::mapでoperator[が使えないとき]

container-map map

サポートサイト Wikidot.com container-mapmap