【问题标题】:Character Array as a value in C++ map字符数组作为 C++ 映射中的值
【发布时间】:2023-04-10 18:42:01
【问题描述】:

我想定义类似的东西

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

【问题讨论】:

  • 您是否尝试定义一个包含char[5]struct
  • 为什么不char * 或者更好的string
  • @OmnipotentEntity,是的,我可以通过将其设为结构来做到这一点 :) 但是您能否解释一下为什么将其设为结构而不是 char[5] 本身?
  • 答案很好,但没有人讨论为什么这样的构造在 c++ 中是不可能的,或者如果 c++ 编译器接受声明,如何使用它?仅从理论上的角度来看。

标签: c++ dictionary std stdmap c++-standard-library


【解决方案1】:

我了解您的性能要求(因为我也做过类似的事情),但是以这种方式使用字符数组是相当不安全的。

如果您可以访问 C++11,则可以使用 std::array。然后你可以像这样定义你的地图:

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

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

【讨论】:

  • 对不起,我不能使用 boost 库
  • 这两个&gt; 应该用空格字符分隔。否则,将其视为operator&gt;&gt;
  • @timrau 在 C++11 中不再存在。看看here
【解决方案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;
}

【讨论】:

  • 您基本上是在重新实现一个更简单的 std/boost 数组版本。如果 OP 无法访问 C++11 或 boost,则此解决方案可能很有用,否则无需重新发明轮子。
  • 如何获取数据?我使用了 printf("%s\n", myMap[0].data) ,但它不起作用。
【解决方案3】:

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

【讨论】:

  • 您只需要对key_type进行比较,而不是mapped_type
  • 是的,在我的情况下,我需要映射类型的 char 数组,因此只需将其设为结构,它就对我有用。 tyepdef struct { char arr[5]; } 固定数组;上面的结构对我有用。
【解决方案4】:

您不能在标准容器中使用数组。

  1. 使用std::vector 而不是数组

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

  3. 使用 boost tuples 代替 5 个元素的数组。

  4. 不要使用数组,而是创建一个新的struct,它需要 3 个元素。制作map&lt;int, newstructtype&gt;。或者将您的数组包装在 struct 中,这也可以。

\

struct ArrayMap
{
    int color[5];
};

/

【讨论】:

    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2012-01-23
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多