21195


C++でchar型マップを作成しました。しかし参照できません。

[code]

    #include<iostream>
    #include<map>
    
    using namespace std;
    
    const map<char, char> M{
      {0x0, 0xc},
      {0x1, 0x5},
      {0x2, 0x6},
      {0x3, 0xb},
      {0x4, 0x9},
      {0x5, 0x0},
      {0x6, 0xa},
      {0x7, 0xd},
      {0x8, 0x3},
      {0x9, 0xe},
      {0xa, 0xf},
      {0xb, 0x8},
      {0xc, 0x4},
      {0xd, 0x7},
      {0xe, 0x1},
      {0xf, 0x2}
    };
    
    
    int main(){
    
      cout << static_cast<bitset<4> > (M[0x0]) << endl;
      return 0;
    }
    
[/code]

下記エラーが出てしまいます。

[code]

    test.cpp:46:40: error: no viable overloaded operator[] for type 'const map<char, char>'
      cout << static_cast<bitset<4> > (M[0x0]) << endl;
                                       ^~~~
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map:1006:18: note: candidate function not viable: 'this' argument has type
          'const map<char, char>', but method is not marked const
        mapped_type& operator[](const key_type& __k);
                     ^
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/map:1008:18: note: candidate function not viable: 'this' argument has type
          'const map<char, char>', but method is not marked const
        mapped_type& operator[](key_type&& __k);
                     ^
    1 error generated.
    
[/code]

このようなmapを使うことはできますか。


CC BY-SA 3.0
2016-01-22T11:14:34.573
21193
2016-01-22T12:46:18.540
7232
question
c++ c++11
4ビットchar型をmapのキーとしたmapを参照できない


`std::map`は`const`にすることはできません。なぜなら

[code]

    M[0x10] = 0;
    
[/code]

のように新たな要素を挿入できるようにするために`operator[]`は非constとなっているからです。メンバー関数`at()`であれば挿入を行わずconstバージョンも用意されているため

[code]

    cout << static_cast<bitset<4> > (M.at(0x0)) << endl;
    
[/code]

とできます。

* * *

ただし正直言って4bit＝16要素であれば二分探索する`std::map`よりもO(1)でアクセス可能な`std::array`をお勧めします。こちらであれば意図通り`const`にもできますし、`operator[]`によるアクセスもできます。

[code]

    #include <array>
    #include <iostream>
    using namespace std;
    
    const array<char, 16> M{ 0xc, 0x5, 0x6, 0xb, 0x9, 0x0, 0xa, 0xd, 0x3, 0xe, 0xf, 0x8, 0x4, 0x7, 0x1, 0x2 };
    
    int main(){
        cout << static_cast<bitset<4> > (M[0x0]) << endl;
        return 0;
    }
    
[/code]


CC BY-SA 3.0
2016-01-22T12:01:13.037
21195
2016-01-22T12:46:18.540
2016-01-22T12:46:18.540
4236
4236
21193
answer


`operator[]`はconst版がありませんのでconstな`map`には使えません。

代わりに`at()`を使ってください。

[code]

    int main(){
    
      cout << static_cast<bitset<4>>(M.at(0x0)) << endl;
      return 0;
    }
    
[/code]


CC BY-SA 3.0
2016-01-22T12:37:12.557
21196
2016-01-22T12:37:12.557
3639
21193
answer