在C++中将字符数组作为值Map

8wtpewkr  于 2023-01-03  发布在  其他
关注(0)|答案(6)|浏览(297)

我想定义一下

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

jm2pwxwz

jm2pwxwz1#

我理解您的性能需求(因为我也做类似的事情),但是以这种方式使用字符数组是相当不安全的。
如果你有C++11的权限,你可以使用std::array,然后你可以定义你的map如下:

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

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

yjghlzjz

yjghlzjz2#

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

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

ulmd4ohb3#

不能在标准容器中使用数组。
1.使用std::vector而不是数组
1.使用指向5个元素的数组的指针Map。
1.使用boost tuples而不是5个元素的数组。
1.不使用数组,而是创建一个新的struct,它包含3个元素。创建map<int, newstructtype>。或者将数组 Package 在struct中,这样也可以工作。
\

struct ArrayMap
{
    int color[5];
};

/

eufgjt7s

eufgjt7s4#

取代:

myMap.insert(pair<int, char[5]>(0,arr));

按如下方式填充位置:

strncpy(myMap[0], arr, 5);
628mspwn

628mspwn5#

假设目标是简化代码编写,那么使用一个编写技巧,让编译器将变量重新赋值给指针和整数:例如,对于变量wide和high(如TIFF文件中),请尝试

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#define loc_wdth 30  /* location information on TIFF */
#define loc_hght 42  /* location information on TIFF */
main() {
 uint32_t  size;
 unsigned char *buff = calloc( 200000, sizeof( char));
  
 uint32_t *wide_o = (uint32_t *) &buff[ loc_wdth];
 uint32_t *high_o = (uint32_t *) &buff[ loc_hght];

#define wide    wide_o[ 0]
#define     high    high_o[ 0]

  buff[ loc_wdth] = 2;  /* reverse byte/bit order */
  buff[ loc_hght] = 3;
  
  printf("%x %x\n", buff[ loc_wdth], buff[ loc_hght]);

  size = wide * high;
  printf("w x h = %d x %d, size= %d\n", wide, high, size);

  wide = 16000; /* > 255, 2 bytes */
  high = 10000; /* > 255, 2 bytes */
  size = wide * high;   /* produces 4 byte result w/o 
using uint32_t any more */
  printf("w x h = %d x %d, size= %d\n", wide, high, size);
}
/*################## demo.c########################*/
5ktev3wc

5ktev3wc6#

根据documentation,对可以包含不同的类(并为不同的类定义)。C数组不是类,而是构造。您必须使用重载的operator[]()定义自己的类。可能还需要比较运算符

相关问题