将指针存储在 C++ 标准库容器中

Storing pointers inside C++ standard library containers

提问人:Max Paython 提问时间:12/13/2021 最后编辑:Max Paython 更新时间:12/14/2021 访问量:128

问:

我正在实施一个项目,在一个需要我创建数亿个对象的环境中。我将这些字符串存储在多个容器中,因此这些对象的计数(复制)成倍增加,这对我的程序来说是一个巨大的瓶颈。std::string

我正试图想出一个解决方案,我的在线研究已经让我走了这么远。基本上,我的想法是,鉴于我构造的字符串是常量的并且不必要地复制,我想分配我自己的 c 型字符串(char 数组),并在容器之间共享这些指针(我需要这些容器,因为查找、插入等具有不同的优势......

我使用的主要容器是 、 、 。对于最后两个,我正在寻找使这些容器与类型兼容的方法。我使用了 stackoverflow 的帮助,为 like 创建了一个自定义哈希函数和一个比较(小于“<”)。std::vectorstd::mapstd::unordered_setchar*std::unordered_setchar*std::map<_,_,less_than>

为了弄清楚我的问题,我将列出它们。

  1. 在讨论技术问题之前,这是可以实现的,还是标准的用法,还是值得努力的?
  2. 比较功能工作正常,插入成功。但是,鉴于两个指针可以指向同一个字符串,但就像 和 中的不同键一样,我还需要类似相等运算符重载的东西才能使用 or 之类的方法。例如,如果 和 ,应该能够删除条目(如果存在)条目(假设两个 '位于不同的内存位置内)。std::ordered_setstd::mapcontainseraseconst char* p1 = "beta"const char* p2 = "beta"std::map::erase(p1)p2std::map"beta"
  3. 如果我把自己说清楚,有没有更好的方法?

感谢您抽出时间接受采访。

C++ 指针 20 stdmap c++-标准库

评论

2赞 sweenish 12/13/2021
现在,这听起来像是一个潜在的设计问题。
5赞 Jarod42 12/13/2021
std::string_view可能是一种选择......
1赞 Marek R 12/13/2021
is there a better way?首先,我们必须知道你的程序到底做了什么来回答这个问题。现在你只是描述了“你的方式”,而没有解释它的作用。
3赞 PaulMcKenzie 12/13/2021
我需要创建数以亿计的 std::string 对象 -- 这些字符串中的任何一个是否彼此重复?如果有大量重复,也许蝇量级设计模式可能是一种选择。Boost 有一个。
2赞 A M 12/13/2021
从我所读到的内容来看,我强烈建议使用数据库。想象一下,平均有 20 个字符的 1 亿个字符串将是 2GB 的数据。数据库将高速完成您需要的所有事情。各种分类、独特性和关系。我会用它。但也许有些要求我不知道......

答: 暂无答案