让 std::map 分配器工作
我有一个非常基本的分配器:
template<typename T>
struct Allocator : public std::allocator<T> {
inline typename std::allocator<T>::pointer allocate(typename std::allocator<T>::size_type n, typename std::allocator<void>::const_pointer = 0) {
std::cout << "Allocating: " << n << " itens." << std::endl;
return reinterpret_cast<typename std::allocator<T>::pointer>(::operator new(n * sizeof (T)));
}
inline void deallocate(typename std::allocator<T>::pointer p, typename std::allocator<T>::size_type n) {
std::cout << "Dealloc: " << n << " itens." << std::endl;
::operator delete(p);
}
template<typename U>
struct rebind {
typedef Allocator<U> other;
};
};
当我将它与“std::vector >”一起使用时效果很好,但是,当我尝试将它与 std::map 一起使用时:
int main(int, char**) {
std::map<int, int, Allocator< std::pair<const int, int> > > map;
for (int i(0); i < 100; ++i) {
std::cout << "Inserting the " << i << " item. " << std::endl;
map.insert(std::make_pair(i*i, 2*i));
}
return 0;
}
它无法编译(gcc 4.6)给出一个非常长的错误,结尾为: /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_tree.h:959:25:错误:与调用 '(Allocator
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为分配器是第四个模板参数,而第三个参数是像, 分配器< std::pair > > 应该可以工作。
std::less
这样的比较器?所以 std::map
另外我认为你应该添加默认构造函数和复制构造函数:
Because allocator is 4th template parameter, whereas 3rd parameter is comparator like
std::less
?so
std::map<int, int, std::less<int>, Allocator< std::pair<const int, int> > >
should work.Also I think you should add default ctor and copy ctor:
如果有人正在寻找通用方法:
然后使用它,
In case if someone is looking for the generalized way:
Then use it,