Character Array as a value in C++ map
21,003
Solution 1
One way is to wrap the fixed size character array as a struct.
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;
}
Solution 2
I understand your performance requirements (since I do similar things too), but using character arrays in that way is rather unsafe.
If you have access to C++11 you could use std::array
. Then you could define your map like:
map <int, array<char, 5>> myMap;
If you cannot use C++11, then you could use boost::array
.
Author by
Master Oogway
Software Engineer in Embedded Graphics at Nvidia
Updated on October 12, 2020Comments
-
Master Oogway over 3 years
I want to define something like
Map<int, char[5] > myMap;
The above declaration is accepted by c++ compiler and no error is thrown but when I do something like this
int main() { char arr[5] ="sdf"; map <int, char[5]> myMap; myMap.insert(pair<int, char[5]>(0,arr)); return 0; }
I get error as:
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
It is important for me to define a fixed size character array because it optimizes my network stream operation. Is there any way to achieve it? I do not want to use
char *
orstd::string
.