【问题标题】:reserve() function for Vector Of Strings in C++C++中字符串向量的reserve()函数
【发布时间】:2018-05-14 06:24:48
【问题描述】:

我正在尝试填充字符串类型的向量,并且字符串的内存将定期更新。我在论坛中发现,由于每次更新内存重新分配,这两个过程都会消耗大量时间大小,我还读到保留功能几乎可以解决这两种情况的问题。 -> String & vector

我的向量不需要超过 1024 个插槽,每个字符串需要 10 个字符空间。 我为我的向量保留了 1024 个内存插槽。

vector<string> power_set;
power_set.reserve(1024);

但是有没有办法为向量槽内的字符串保留内存槽?

提前致谢。

【问题讨论】:

  • 字符串有一个reserve() 函数。所以是的,您可以遍历容器并为每个字符串保留足够的空间。
  • 您是否考虑过使用std::array&lt;char, 10&gt; 而不是std::string
  • 您实际上可能不需要对 10 个字符的字符串调用 reserve,因为小字符串优化确实避免了分配。
  • 也许您不应该相信您在论坛上阅读的所有内容? stringvector 不会在每次您更改大小时重新分配内存。重新分配很少发生,足以使其成为amortized constant time。此外,1024 是一个足够小的数字,您几乎不会注意到任何差异。
  • 这是有道理的@BoPersson .. 感谢您的信息.. 那么我想我可以不用reserve() 函数

标签: c++ string vector stl c++14


【解决方案1】:

我的向量不需要超过 1024 个插槽,每个字符串需要 10 个字符空间

然后,考虑MyString 类的以下(部分)定义:

#include <array>
#include <string>   

class MyString {
    std::array<std::string::value_type, 10> str;

public:
// ...
};

通过使用MyString而不是std::string,在std::vector上调用reserve时,MyString中包含的字符串(即:str,即std::array)所需的内存将被分配:

vector<MyString> power_set;
power_set.reserve(1024);

【讨论】:

    【解决方案2】:

    您也可以对字符串使用保留。我对向量不是很有经验,但您可以创建一个自定义类,为字符串字段分配一定数量的字符,然后使用该类的向量。

    【讨论】:

      【解决方案3】:

      我会创建一个自定义分配器,它会在被询问时返回额外的 10 个字节 - 以确保仅完成 1 个分配/字符串。但我不得不说这听起来很像过早的优化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多