Haruyuki Mohri

毛利春幸のブログです。

C++Builderでstd::unordered_mapを使う

std::unordered_mapを使う。

先日、「Optimized C++」書籍についてのC++勉強会に参加しました。
その時、std::unordered_mapの議論もありました。
C++Builderでは、std::unordered_mapも使用できます。
 
刈谷さんがstd::unordered_mapについて詳しくスライドを書かれています。
https://www.slideshare.net/kariya_mitsuru/ss-55842496

std::unordered_map はハッシュテーブルで実装されているので
キーの順番などを保持しない場合に有効です。

unordered_map初期化

std::unordered_map<String, TButton*> unordered_map1{
    {"Button_1", new TButton(this)},
    {"Button_2", new TButton(this)},
    {"Button_3", new TButton(this)}
};

“for"文で取得

for (auto b : unordered_map1)
{
    b.second->Name = b.first;
    b.second->Text = b.first;
    int i_{StrToInt(StringReplace(b.first, "Button_", "", TReplaceFlags() << rfReplaceAll) )};
    b.second->Position->X = 10;
    b.second->Position->Y = 10+30*i_;
    b.second->OnClick     = do_add_button;
    this->AddObject(b.second);
}

“at"で取得できます。

unordered_map1.emplace(s_, new TButton(this)); でも可能です。

void __fastcall TForm1::do_add_button(TObject *Sender)
{
    TButton* b_ = static_cast<TButton*>(Sender);
    UnicodeString s_ = "new" + b_->Name;
    unordered_map1[s_] = new TButton(this);
    unordered_map1[s_]->Position->X = 200;
    unordered_map1[s_]->Position->Y = 40;
    unordered_map1[s_]->Name = s_;
    this->AddObject(unordered_map1[s_] );

}

f:id:mojeld:20170611000255p:plain