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 *or 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

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

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. 使用 anstd::vector而不是数组

  2. 使用指向 5 个元素的数组的指针映射。

  3. 使用boost 元组而不是 5 个元素的数组。

  4. 而不是使用数组创建一个struct需要 3 个元素的新数组。使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 回答