c++ - 寻找类似 C++ STL 的 vector 类但使用堆栈存储

标签 c++ data-structures stl vector

在我自己写之前,我会问你们所有人。

我正在寻找一个几乎完全像 STL vector 但将数据存储到堆栈上的数组中的 C++ 类。某种 STL 分配器类也可以工作,但我试图避免任何类型的堆,甚至是静态分配的每线程堆(尽管其中一个是我的第二选择)。堆栈效率更高。

它几乎需要替换当前使用 vector 的代码。

对于我自己要写的东西,我在想这样的事情:

char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));

或者该类可以在内部分配缓冲区空间。然后它看起来像:

stack_vector<match_item, 256> matches;

我在想,如果空间不足,它会抛出 std::bad_alloc,尽管这不应该发生。

更新

使用 Chromium 的 stack_container.h 效果很好!

我自己没想过这样做的原因是我一直忽略了 STL 集合构造函数的分配器对象参数。我曾多次使用模板参数来做静态池,但我从未见过代码或编写过任何实际使用对象参数的代码。我学到了一些新东西。很酷!

代码有点乱,出于某种原因,GCC 强制我将分配器声明为实际项目,而不是将其构造为 vector 的分配器参数。它来自这样的东西:

typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector< comp_list_item > comp_list_type;

comp_list_type match_list;
match_list.reserve(32);

到这里:

static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;

comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc( &match_list_buffer );
comp_list_type match_list( match_list_alloc );
match_list.reserve( comp_list_alloc_size );

每当我宣布一个新的时,我都必须重复这一点。但它就像我想要的那样工作。

我注意到 stack_container.h 定义了一个 StackVector,我尝试使用它。但它没有从 vector 继承或定义相同的方法,因此它不是一个直接替代品。我不想用 vector 重写所有代码,所以我放弃了。

最佳答案

您不必编写全新的容器类。您可以坚持使用您的 STL 容器,但更改例如 std::vector 的第二个参数,为它提供从堆栈缓冲区分配的自定义分配器。 Chrome 作者为此编写了一个分配器:

https://chromium.googlesource.com/chromium/chromium/+/master/base/stack_container.h

它的工作原理是在你说它有多大的地方分配一个缓冲区。您创建容器并调用 container.reserve(buffer_size);。如果溢出该大小,分配器将自动从堆中获取元素(因为它是从 std::allocator 派生的,在这种情况下它将只使用标准分配器的功能)。我还没有尝试过,但它看起来像是来自谷歌,所以我认为值得一试。

用法是这样的:

StackVector<int, 128> s;
s->push_back(42); // overloaded operator->
s->push_back(43);

// to get the real std::vector. 
StackVector<int, 128>::ContainerType & v = s.container();
std::cout << v[0] << " " << v[1] << std::endl;

关于c++ - 寻找类似 C++ STL 的 vector 类但使用堆栈存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/354442/

相关文章:

使用 c++ 类,以便在实例化时产生编译错误

c++ - 将 float 类型转换为 int 的正确方法是什么,反之亦然?

c++ - 为什么我的异常在某些配置上被捕获而在其他配置上却没有?

c++ - 确定 8 字节数据的性质

c++ - 显示垃圾值的二进制文件处理程序 (Turbo C++)

c++ - 如何实现 back_insert_iterator 的结束哨兵?

c++ - 在 C++ STL 中交织/解交织 3 个 vector

c++ - 模板中的静态变量未定义

c++ - 关于 C++ 中的列表

python - Python 中遗传算法的哪些数据类型?