让 std::map 分配器工作

发布于 2024-11-14 11:09:10 字数 1537 浏览 2 评论 0 原文

我有一个非常基本的分配器:

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 >) 不匹配(std::pair::first_type&, const int&)'

I've got an extremely basic allocator:

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

Which works fine when I use it with: "std::vector >", however, when I try use it with an std::map like:

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

It fails to compile (gcc 4.6) giving an extremely long error ending with: /usr/lib/gcc/x86_64-redhat-linux/4.6.0/../../../../include/c++/4.6.0/bits/stl_tree.h:959:25: error: no match for call to ‘(Allocator<std::pair<const int, int> >) (std::pair<const int, int>::first_type&, const int&)’

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ま昔日黯然 2024-11-21 11:09:10

因为分配器是第四个模板参数,而第三个参数是像 std::less 这样的比较器?
所以 std::map, 分配器< std::pair > > 应该可以工作。

另外我认为你应该添加默认构造函数和复制构造函数:

  Allocator() {}

  template<class Other>
  Allocator( const Allocator<Other>& _Right ) {}

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:

  Allocator() {}

  template<class Other>
  Allocator( const Allocator<Other>& _Right ) {}
南冥有猫 2024-11-21 11:09:10

如果有人正在寻找通用方法:

template<class Key, class T,class Compare = std::less<Key>, class _Ax = Allocator<std::pair<const Key, T> >>
class Map : public std::map<Key, T, Compare, _Ax >
{
};

然后使用它,

Map<int,char> myMap;
myMap.insert<std::pair<int,char>(1,'o');

In case if someone is looking for the generalized way:

template<class Key, class T,class Compare = std::less<Key>, class _Ax = Allocator<std::pair<const Key, T> >>
class Map : public std::map<Key, T, Compare, _Ax >
{
};

Then use it,

Map<int,char> myMap;
myMap.insert<std::pair<int,char>(1,'o');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文