c++ - 如何将分配器与 std::set 一起使用?

标签 c++ set c++14 c++17 allocator

我正在尝试使用我自己的分配器来测量 C++ std::set 中的内存使用情况。不幸的是,我在链接时遇到错误。为了简化问题,我有以下程序:

#include<set>
#include<vector>
#include<memory>
//using Container = std::vector<int, std::allocator<int>>;
using Container = std::set<int, std::allocator<int>>;

int main() {
  Container container;
  container.push_back(4711);
  container.insert(4711);  
  return 0;
}

结果可以在 wandbox https://wandbox.org/permlink/R5WcgSvSWiqstYxL#wandbox-resultwindow-code-body-1 中找到

我已经尝试了 gcc 6.3.0、gcc 7.1.0、clang 4.0.0 和 clang 6.0.0HEAD。在所有情况下,我在使用 std::set 时都会出错,但在使用 std::vector 时不会出错。

如何声明我的集合使用分配器?

我想使用 C++17,但 C++14 中的答案也很好。

最佳答案

你应该看看 std::set 的模板参数更紧密地:

template<
    class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>
> class set;

当你写:std::set<int, std::allocator<int>>你是说你想使用分配器来比较键。这没有任何意义,并且因为分配器不像比较器那样可调用,所以编译器会提示。

您需要明确提供 Compare参数:

using Container = std::set<int, std::less<int>, std::allocator<int>>;

关于c++ - 如何将分配器与 std::set 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45803409/

相关文章:

c++ - 如何从 C++ 中的函数返回多个值?

android - 如何在文本转语音中使用印地语(印度母语)?

C++ 后缀表达式未定义与未指定行为

c++ - (c++14) operator<< 重载不能按智能指针 vector 的预期工作

c++ - 为什么会出现段错误?

python - 通过 std::system 调用 python 时出错

java - 为什么 Java 方法不带参数 Collection<?扩展 V> 接受 Set<V>?

swift - 获取 Swift 集中的下一个项目

c++ - *here* 的参数相关查找如何?

c++ - 在CMake项目下编译单个文件?