容器 class 用于编译时初始化的常量数据

container class for constant data with compile time initialization

我搜索的东西是 std::vector 但没有大的开销,而且比 std::array 多一点,因为 std::array 我没有存储大小(它只是从类型本身知道)。

我想达到的目标:

用"dynamic"个容器写成这样:

std::map< int, std::vector< std::pair<int,int>>>;

我不需要在运行时修改,但我需要运行时的大小信息。用 std::array 替换 std::vector 是行不通的,因为所有映射条目的数组大小必须相同,这不是我需要的。

只有我!想问一下周围是否已经有可用的实现。如果答案只是 "No",则无需建议如何完成这项工作。我只想不再重新发明轮子:-)

背景:我可以在我的小型 avr 控制器上使用 stl,但开销 "a bit" 太高了。所以我寻找一个有希望的标准实现,它符合编译时间常量表示的需要,具有 begin()/end() 和迭代器等已实现的功能,以满足最低容器要求,使它们与基于范围的 for 和其他一起使用。

c++14也可以,如果有我搜索的

我发现的所有内容都是完整的模板实现,其中对数据的访问也是编译时常量,如:

container.get<2>() 

我也无法使用,因为我需要运行时变量来访问我的数据。

编辑:problem/overhead 在使用 std::vector 时出现:

在使用 std::vector 时,我还需要 new/delete,这导致 malloc/free 用于 avr。我还发现在 avr 上,向量本身的初始化为我使用的每个模板实例占用了大约 350 字节的代码。 operator[] 和迭代器等访问函数非常小。

我不太清楚你在寻找什么,但我认为你可以通过以下方式实现你的需要:

  1. 你不知道每个包含元素的确切大小(比如N个元素),你会在程序启动时知道。然后,只要知道容器的大小,就只保留一个连续的内存块来保存所有容器的所有内部元素。 (一个动态分配)
  2. 使用范围构造的向量创建地图:std::vector(start, end),其中起点和终点通过 N 个元素的块计算。
  3. 然后填充地图。如果你不是严格需要地图,你也可以计算每个向量的开始和结束位置,然后创建一个初始数组,其中包含每个向量位置的索引...

为避免 std::vector 开销 ,您可以改用 std::initializer_list

const std::map<int, std::initializer_list<std::pair<int, int>>>

你问的这个在原理上好像是不可能的。你说你想避免像类型这样的向量的堆分配,但是在编译时必须知道堆栈上类型的大小,并且对于该类型的所有成员都是一样的。由于 map 是同构容器,因此值类型必须是具有恒定大小的单一类型。您可以用元组替换地图,但是您的所有密钥都必须在编译时知道。