【问题标题】:C++ Fixed size container with swappable elements具有可交换元素的 C++ 固定大小容器
【发布时间】:2011-07-05 17:53:06
【问题描述】:

我正在寻找具有以下功能的容器:

  • 在运行时固定大小。因此,不应以小块的形式分配内存(如 std::list 那样)。
  • 元素应该是可交换的(类似于std::list::splice 提供)。

编辑: 考虑一个列表:我只需要将元素从任意位置移动到前面。 编辑2: 我想使用 std::list 之类的东西,但要利用运行时固定大小。

【问题讨论】:

    标签: c++ stl containers


    【解决方案1】:

    我会想到 TR1 数组:

    std::array<T, int>
    

    或者,如果你还没有,

    boost::array<T, int>
    

    这对于所有意图和目的都是相同的。当然,std::swap 对元素的有效性取决于正确的复制构造函数/赋值运算符的可用性。

    【讨论】:

    • boost::array&lt;T, int&gt; 具有编译时间大小。此外,我想使用类似于列表的东西,因为我不想复制元素。
    • 对不起;如果你想减少分配,std::vector::resize 是你的朋友。除非需要,否则有适当的保证不会重新分配
    【解决方案2】:

    我不太清楚你在找什么。想到了两个解决方案:std::vector(以最大大小创建),以及为您的对象很好地实现swap,或者为std::list 的自定义分配器,它预先分配了您将要分配的节点数需要在一个块中。

    【讨论】:

    • 是的,你是对的。最简单的方法是使用自定义allocator
    • 在这方面,boost 有一个专门用于列表的池分配器,可能值得研究。
    • @Nim - 感谢您的建议。与我自己的自定义实现相比,我已经测试了boost::pool_alloc(独家释放)的性能。 boost 在合适的情况下似乎很好,但在我的场景中,我自己的更快。
    【解决方案3】:

    您可以在构造时指定std::list 的(初始)大小:

    std::list<Type> myList = std::list<Type>(10);
    

    之后你仍然可以扩大/缩小它,但列表将从一开始就包含 10 个默认构造的 Type 对象。

    这符合您的需要吗?

    【讨论】:

    • std::list 对我的目的造成的内存碎片过多。
    • @FrEEzE2046 :然后使用自定义分配器(如其他地方所建议的)可以实现这一点。
    【解决方案4】:

    std::vector ?

    基于数组。可以指定大小并具有交换功能。

    你还没有说你会用它做什么,所以我真的不知道你是否会遇到任何速度问题。

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多