字符数组作为C++映射中的值

Mas*_*way 6 c++ dictionary stdmap std c++-standard-library

我想定义类似的东西

Map<int, char[5] > myMap;
Run Code Online (Sandbox Code Playgroud)

上面的声明被c ++编译器接受,并且没有抛出错误,但是当我做这样的事情时

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

我得到错误:

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
Run Code Online (Sandbox Code Playgroud)

对我来说,定义固定大小的字符数组非常重要,因为它可以优化我的网络流操作.有没有办法实现它?我不想用char *std::string.

bet*_*ido 8

我理解你的性能要求(因为我也做类似的事情),但以这种方式使用字符数组是相当不安全的.

如果您可以访问C++ 11,则可以使用std::array.然后你可以定义你的地图,如:

map <int, array<char, 5>> myMap;
Run Code Online (Sandbox Code Playgroud)

如果您不能使用C++ 11,那么您可以使用boost::array.

  • @timrau不再是C++ 11了.看看[这里](http://en.wikipedia.org/wiki/C%2B%2B11#Right_angle_bracket). (8认同)
  • 两个`>`应该用空格字符分隔.否则,它被视为`operator >>. (2认同)

tim*_*rau 3

一种方法是将固定大小的字符数组包装为结构体。

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您基本上是在重新实现 std/boost 数组的更简单版本。如果 OP 无法访问 C++11 或 boost,则此解决方案可能很有用,否则无需重新发明轮子。 (2认同)