【问题标题】:Fixed size string type container固定大小的字符串类型容器
【发布时间】:2017-01-12 00:24:24
【问题描述】:

我需要一个固定大小的字符串类型来满足某些要求。现在我一直在做一个简单的char[20] 字符数组来满足这个要求。但是,它缺少我不时需要的某些对 stl 容器友好的属性。例如,一个简单的empty()clear() 方法非常频繁地需要,并且length/size 属性或getSize() 方法可能会返回此属性或不管理'/0' 的能力。不是实际大小,而是填充容器的字符串大小。

现在我知道我可以重新实现这一切,我可能会在将来有时间时重新实现,但现在还有其他方法可以实现吗?

【问题讨论】:

  • 你刚刚描述了一个std::string
  • @SamVarshavchik 除非它不是固定大小。例如 std::vectorstd::array
  • 当你想拥有像'clear()'这样的方法时,你不能有一个“固定大小”,它会改变字符串的大小。下定决心:要么你想要一个固定大小的std::array,例如,在这种情况下你有一个固定大小的数组 - 没有 clear()、empty() 等...... - 或者你想要一个可变长度字符串,又名std::string.
  • @SamVarshavchik by clear 在固定大小字符串的上下文中表示用空值填充。
  • 那么,使用std::array<char, 10>。使用fill() 将其清除为空。

标签: c++ string c++11 stl containers


【解决方案1】:

我假设您希望将小字符串保留在原地,避免在访问时在堆上分配和间接访问。在这种情况下,请查看来自 Boost 的small_vector

typedef boost::container::small_vector<char> small_string;

这可以作为你想要的字符串。

更新:似乎标准 C++ 库的许多实现都使用了 std::string 的小字符串优化 (SSO)。这意味着只要您的字符串足够小(例如 64 位架构上的 22 个字符),它将被原地存储。我强烈建议你使用标准的std::string

【讨论】:

  • 在哪里可以了解有关 SSO 的更多信息?我的字符串可能最多 8-10 个字符,但可能必须同时支持 32 位和 64 位系统。
  • 找到了——你可以把它和你的答案联系起来:stackoverflow.com/a/21710033/4785903
【解决方案2】:

由于该问题专门要求固定大小的字符串,因此当前答案 (small_vector) 是错误的,因为它没有固定大小。

@SamVarshavchik 在 cmets 中提到,最接近的匹配是 std::array&lt;char, N&gt;

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 2017-01-03
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2010-12-28
    相关资源
    最近更新 更多