Символьный массив как значение в C++ map

Я хочу, чтобы определить что-то вроде

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 ответов


один из способов-обернуть массив символов фиксированного размера как структуру.

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;
}

Я понимаю ваши требования к производительности (так как я тоже делаю подобные вещи), но использование символьных массивов таким образом довольно небезопасно.

Если у вас есть доступ к C++11, вы могли бы использовать std::array. Затем вы можете определить свою карту следующим образом:

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

Если вы не можете использовать C++11, то вы можете использовать boost::array.


вы не можете использовать массив в стандартном контейнере.

  1. использовать std::vector вместо массива

  2. использовать карту указателей на массивы из 5 элементов.

  3. использовать увеличить кортежей вместо массива из 5 элементов.

  4. вместо использования массива сделайте новый struct это занимает 3 элемента. Сделайте map<int, newstructtype>. Или оберните массив в struct и это будет работать тоже.

\

struct ArrayMap
{
    int color[5];
};

/


по данным документация пара может содержать (и быть определена для) различных классов. Массив C - это не класс, а конструкция. Вы должны определить свой собственный класс с перегруженными operator[](). Также могут потребоваться операторы сравнения