【问题标题】:How to change size of STL container in C++如何在 C++ 中更改 STL 容器的大小
【发布时间】:2010-04-20 16:47:37
【问题描述】:

我有一段用指针和动态内存编写的性能关键代码。 我想用 STL 容器重写它,但我有点担心性能。有没有办法在不初始化数据的情况下增加容器的大小?

例如,而不是做

ptr = new BYTE[x];

我想做类似的事情

vec.insert(vec.begin(), x, 0);

但是,这会将每个字节初始化为 0。难道没有办法让向量增长吗? 我知道reserve(),但它只是分配内存,它不会改变向量的大小,并且在我插入有效数据之前不允许我访问它。

谢谢大家。

【问题讨论】:

  • 为什么要访问不包含有效数据的东西?
  • 你不应该关心这个。 std::vector 是一个通用数组。如果您需要原始速度,那么它不是为此而设计的(尽管对于我使用过的任何东西来说已经足够快了)。您应该烹饪自己的容器,然后不要无用地初始化项目。
  • 我必须将缓冲区传递给 API,它会告诉我需要多少空间。因此,在普通的旧 C 中,简化一点是: sz = GetSizeNeeded(); buf = malloc(sz); GetBuffer(buf);
  • 谢谢约翰内斯。我只是想确定我没有重新发明轮子。

标签: c++ memory stl containers


【解决方案1】:

vector.resize(...) 可能有帮助吗?您可以指定要调整的大小(变大或变小),还可以初始化您希望将新元素初始化为的大小。

【讨论】:

    【解决方案2】:

    vec.resize( newsize )被定义为和

    一样的效果
    vec.insert( vec.end(), newsize - vec.size(), T() )
    

    如果newsize > vec.size()… 但编译器可能难以确定它是在增长,而不是在缩小,以及增长了多少。您可以尝试同时使用两者进行分析。

    如果您确定默认初始化需要时间,请使用您自己的构造函数显式消除它。 (即使隐式构造函数没问题,显示意图也很好。)

    struct BYTE {
        char v;
        BYTE() {} // no default initialization!
        BYTE( char x ) : v(x) {}
        operator char&() { return v; }
        operator char const&() const { return v; }
        char *operator&() { return &v; } // not sure about operator&...
        char const *operator&() const { return &v; } // probably good in this case
    };
    

    【讨论】:

      【解决方案3】:

      调整大小()

      它可能会也可能不会做任何与您的 insert() 不同的事情。值是默认构造的。

      【讨论】:

      • 呃,谢谢。没看到。无论如何,如果值是默认构造的,我不会赌它的性能。
      • @Jamie:如果这是您问题的答案,请点击向上箭头进行投票,并点击诺亚帖子左侧的大复选标记接受。
      • @raven 它们是默认构造的,但BYTE 通常有一个默认构造函数,它是无操作的,所以在这种特殊情况下,它应该是常数时间。
      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 2022-01-14
      • 2014-11-14
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多