6

次のようなものを定義したい

Map<int, char[5] > myMap;

上記の宣言は C++ コンパイラによって受け入れられ、エラーはスローされませんが、このようなことをすると

int main()
{
    char arr[5] ="sdf";
    map <int, char[5]> myMap;
    myMap.insert(pair<int, char[5]>(0,arr));
    return 0;
}

次のようなエラーが発生します。

In file included from /usr/include/c++/4.6/bits/stl_algobase.h:65:0,
                 from /usr/include/c++/4.6/bits/char_traits.h:41,
                 from /usr/include/c++/4.6/ios:41,
                 from /usr/include/c++/4.6/ostream:40,
                 from /usr/include/c++/4.6/iostream:40,
                 from charMap.cpp:1:
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = int, _T2 = char [5]]’:
charMap.cpp:9:42:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:104:31: error: array used as initializer
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = int, _U2 = char [5], _T1 = const int, _T2 = char [5]]’:
charMap.cpp:9:43:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:109:39: error: array used as initializer

ネットワーク ストリーム操作を最適化するため、固定サイズの文字配列を定義することが重要です。それを達成する方法はありますか?char *またはを使用したくありませんstd::string

4

4 に答える 4

9

私はあなたのパフォーマンス要件を理解していますが(私も同様のことをしているので)、そのように文字配列を使用することはかなり危険です。

C ++ 11にアクセスできる場合は、を使用できますstd::array。次に、次のようにマップを定義できます。

map <int, array<char, 5>> myMap;

C ++ 11を使用できない場合は、を使用できますboost::array

于 2012-07-16T17:32:04.817 に答える
2

1 つの方法は、固定サイズの文字配列を構造体としてラップすることです。

struct FiveChar
{
   FiveChar(char in[5]) { memcpy(data, in, 5); }
   char& operator[](unsigned int idx) { return data[idx]; }
   char data[5];
};

int main(void)
{
   char arr[5] = "sdf";
   map<int, FiveChar> myMap;
   myMap.insert(pair<int, FiveChar>(0, arr));
   return 0;
}
于 2012-07-16T17:34:40.943 に答える
1

標準コンテナでは配列を使用できません。

  1. std::vector配列の代わりに を使用する

  2. 5 つの要素の配列へのポインターのマップを使用します。

  3. 5 要素の配列の代わりにブースト タプルを使用します。

  4. 配列を使用する代わりに、struct3 つの要素を持つ new を作成します。を作りますmap<int, newstructtype>。または、配列を a でラップするstructと、それも機能します。

\

struct ArrayMap
{
    int color[5];
};

/

于 2012-07-16T17:35:23.280 に答える
-2

ドキュメントによると、ペアは異なるクラスを保持 (および定義) できます。C配列はクラスではなく、構造です。オーバーロードされた独自のクラスを定義する必要がありますoperator[]()。比較演算子も必要かもしれません

于 2012-07-16T17:35:17.510 に答える