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;