Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用数组作为映射键:即使使用自定义分配器也不可能?_C++_Arrays_Stl_Stdmap_Allocator - Fatal编程技术网

C++ 使用数组作为映射键:即使使用自定义分配器也不可能?

C++ 使用数组作为映射键:即使使用自定义分配器也不可能?,c++,arrays,stl,stdmap,allocator,C++,Arrays,Stl,Stdmap,Allocator,这个问题涉及到 我试图使用固定长度数组作为std::map的键,如下面的非编译代码所示: #include <cstdlib> #include <iostream> #include <map> typedef char myuuid[ 16 ]; template <class T> class MyAlloc { public: typedef T value_type; typedef T* pointer; typedef

这个问题涉及到

我试图使用固定长度数组作为
std::map
的键,如下面的非编译代码所示:

#include <cstdlib>
#include <iostream>
#include <map>

typedef char myuuid[ 16 ];

template <class T>
class MyAlloc
{
public:
  typedef T value_type;
  typedef T* pointer;
  typedef T& reference;
  typedef const T* const_pointer;
  typedef const T& const_reference;
  template <class U> struct rebind { typedef MyAlloc<U> other; };
  MyAlloc() {}
  MyAlloc( const MyAlloc& other ) {}
  T* allocate( std::size_t n ) { return static_cast<T*>( std::malloc( n * sizeof( value_type ) ) ); }
  void deallocate( T* p, std::size_t n ) { std::free( p ); }
};

int main( int argc, char* argv[] )
{
  std::map<myuuid, int, std::less<myuuid>, MyAlloc<myuuid> > map;
  myuuid myu;
  map[ myu ] = 5;

  return 0;
}
问题

我理解为什么上面的内容是非法的,但这说明了
std::map;粘虫;map[myu]=5是非法的吗

问题

我想我也许可以编译
std::map;粘虫;map[myu]=5如果我实现了自定义分配器。我猜想一个
myuuid
=
(赋值)可能会被“重新路由”到
MyAlloc::allocate()
,但这是一个疯狂的、未经分析的猜测,似乎是错误的。有没有办法修改自定义分配器以解决第一个代码块的编译错误

我有一个半生不熟的想法,即
myuuid
操作数上的
operator=
可以“重新路由”到自定义分配器,但我不知道这是否适用于POD(
myuuid
只是类型定义到POD`)

编译错误太大,无法在此处发布,但第一个错误是:

/usr/include/c++/4.8.3/bits/stl_pair.h: In instantiation of \u2018std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = const char [16]; _T2 = int]\u2019:
/usr/include/c++/4.8.3/bits/stl_map.h:469:59:   required from \u2018std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = char [16]; _Tp = int; _Compare = std::less<char [16]>; _Alloc = MyAlloc<char 
[16]>; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = char [16]]\u2019
main.cpp:27:12:   required from here
/usr/include/c++/4.8.3/bits/stl_pair.h:113:31: error: array used as initializer
       : first(__a), second(__b) { }
/usr/include/c++/4.8.3/bits/stl_pair.h:In\u2018std::pair::pair(const_T1&,const_T2&)的实例化[with _T1=const char[16];_T2=int]\u2019:
/usr/include/c++/4.8.3/bits/stl_-map.h:469:59:必需自\u2018std::mapped_-type&std::map::operator[](const-key_-type&)[with _-key=char[16];_-Tp=int;_-Compare=std::less;_-Alloc=MyAlloc;std::map::mapped_-type=int;std::map::map::key_-type=char[16]\u2019
main.cpp:27:12:从这里开始需要
/usr/include/c++/4.8.3/bits/stl_pair.h:113:31:错误:数组用作初始值设定项
:第一(uuu a),第二(uuu b){}
有趣的是,
error:array用作初始值设定项
是我在引入自定义分配器之前试图解决的原始编译错误。所以这似乎是一个递归问题

问题


是否可以通过使用自定义分配器以某种方式将数组用作
std::map
键?(也许我应该实现一个可选功能?)?(在对这些问题的回答中没有提出这个问题,但由于自定义分配器有点深奥,我认为值得单独提一个问题)

原始C数组不是性能良好的类型。你不能分配它们,也不能用它们做很多你想做的事情

其次,
std::less
不起作用

C++提供了
std::array
,它是
struct
中原始C数组的薄包装

typedef std::array<char, 16> myuuid;
typedef std::数组myuuid;

它甚至附带了一个内置的
原始C数组不是性能良好的类型。你不能分配它们,也不能用它们做很多你想做的事情

其次,
std::less
不起作用

C++提供了
std::array
,它是
struct
中原始C数组的薄包装

typedef std::array<char, 16> myuuid;
typedef std::数组myuuid;

它甚至带有内置的
TL;DR但
typedef std::array myuuid只需使用
std::array
std::string
@juanchopanza-谢谢,我愿意接受这一点作为替代,但请回答这个问题,我感兴趣(出于理解/学习的愿望)是否/如何用自定义分配器解决这个问题。@StoneThrow普通数组不可复制或分配。这是语言的一部分,不能被分配器更改。@juanchopanza-“普通数组不可复制或分配”-因此这意味着无法用您可以覆盖非POD的方式覆盖普通数组的
运算符=
-正确吗?TL;DR但
typedef std::array myuuid只需使用
std::array
std::string
@juanchopanza-谢谢,我愿意接受这一点作为替代,但请回答这个问题,我感兴趣(出于理解/学习的愿望)是否/如何用自定义分配器解决这个问题。@StoneThrow普通数组不可复制或分配。这是语言的一部分,并且不能被分配器更改。@juanchopanza-“普通数组不可复制或分配”-因此这意味着无法用您可以覆盖非POD的方式覆盖普通数组的
运算符=
-正确吗?@juanchopanza确实如此。我不经常对数组排序。@juanchopanza确实如此。我不经常对数组排序。
std::map<myuuid, int> map;