gpt4 book ai didi

c++ - 实现一个保证不会移动的 "string pool"

转载 作者:可可西里 更新时间:2023-11-01 16:37:36 24 4
gpt4 key购买 nike

我需要一个“字符串池”对象,我可以在其中重复插入一个“字符序列”(我用这个短语来表示“字符串”,而不会将它与 std::string 或 C 字符串混淆),获得一个指针到序列,并保证如果/当池需要增长时指针不会失效。使用简单的 std::string因为池将无法工作,因为当字符串超出其初始容量时可能会重新分配字符串,从而使所有先前指向它的指针无效。

池不会无限制地增长——有明确定义的点,我将在这些点上调用 clear()它的方法——但我也不想在它上面保留任何最大容量。它应该能够在不移动的情况下生长。

我正在考虑的一种可能性是将每个新的字符序列插入到 forward_list<string> 中。并获得begin()->c_str() .另一个是插入 unordered_set<string> ,但我很难找出当 unordered_set 必须增长时会发生什么。我正在考虑的第三种可能性(不太热心)是滚动我自己的 1K 缓冲区链,我将字符序列连接到其中。这具有(我猜)具有最高性能的优势,这是该项目的要求。

我很想听听其他人会如何建议解决这个问题。

更新 1: 已编辑以澄清我对短语“字符序列”的使用等同于“字符串”的一般概念,而不暗示 std::string 或空终止字符数组。

最佳答案

我过去使用过这种方法:

using Atom = const char*;

Atom make_atom(string const& value)
{
static set<string> interned;
return interned.insert(value).first->c_str();
}

显然,如果您想要/需要清除该集合,您可以使其在更广泛的范围内可用。

为了提高效率,将字符串移动/放置到集合中。

更新 为了完整性,我添加了这种方法。见<强>Live on Coliru

#include <string>
#include <set>
using namespace std;

using Atom = const char*;

template <typename... Args>
typename enable_if<
is_constructible<string, Args...>::value, Atom
>::type emplace_atom(Args&&... args)
{
static set<string> interned;
return interned.emplace(forward<Args>(args)...).first->c_str();
}

#include <iostream>

int main() {
cout << emplace_atom("Hello World\n");
cout << emplace_atom(80, '=');
}

关于c++ - 实现一个保证不会移动的 "string pool",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20938441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com