我想定义类似
的内容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
。
答案 0 :(得分:8)
我理解你的性能要求(因为我也做类似的事情),但是以这种方式使用字符数组是相当不安全的。
如果您有权访问C ++ 11,则可以使用std::array
。然后你可以定义你的地图:
map <int, array<char, 5>> myMap;
如果您不能使用C ++ 11,那么您可以使用boost::array
。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
您不能在标准容器中使用数组。
使用std::vector
代替数组
使用指向5个元素数组的指针映射。
使用boost tuples代替5个元素的数组。
不使用数组而是创建一个包含3个元素的新struct
。制作map<int, newstructtype>
。或者将数组包装在struct
中,这也可以。
\
struct ArrayMap
{
int color[5];
};
/
答案 3 :(得分:-2)
根据documentation对,可以保持(并定义)不同的类。 C数组不是类,而是构造。您必须使用重载operator[]()
定义自己的类。可能还需要比较运算符