具有编译时初始化的常量数据的容器类
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不能工作,因为数组必须对所有map条目具有相同的大小,这不是我需要的。
我只!想问是否已经有一个可用的实现。如果答案是简单的"不",就不需要建议如何做这项工作。我只是不想再重新发明轮子了:-)
背景:我可以在我的小型avr控制器上使用stl,但开销"有点"高。因此,我寻找一个有希望的标准实现,它符合编译时常数表示的需求,具有诸如begin()/end()和迭代器等实现的功能,以满足最低容器要求,使它们与基于范围的for和其他人一起使用。
c++14也可用,如果有什么我搜索。
所有我发现的是完整的模板实现,其中对数据的访问也是编译时间常数,如:
container.get<2>()
我也不能使用,因为我需要运行时变量来访问我的数据。
编辑:使用std::vector:
时出现的问题/开销在使用std::vector时,我还需要new/delete,这导致avr具有malloc/free。我还发现,在avr上,向量本身的初始化对于我使用的每个模板实例需要大约350字节的代码。像operator[]
这样的访问函数和迭代器都很小
为了避免std::vector
的开销,您可以使用std::initializer_list
const std::map<int, std::initializer_list<std::pair<int, int>>>
我不完全清楚你在找什么,但我认为你可以通过以下方式实现你所需要的:
- 你不知道每个包含元素的确切大小(比如N个元素),你将在程序启动时知道它。然后,只要知道容器的大小,就只保留一个连续的内存块来保存所有容器的所有内部元素。(一次动态分配)
- 创建通过range:
std::vector(start, end)
构造的矢量地图,其中开始和结束是通过N个元素的块计算的。 - 然后填充地图。如果你不需要一个地图,你也可以计算每个向量的起始和结束位置,并创建一个初始数组,其中包含每个向量的位置索引…
你所要求的在原则上似乎是不可能的。您说您希望避免类向量类型的堆分配,但是在编译时必须知道堆栈上类型的大小,并且该类型的所有成员都是相同的。由于map是同构容器,因此值类型必须是具有恒定大小的单一类型。您可以用元组替换映射,但是在编译时必须知道所有键。
- 如何正确实现容器类中元素的更改?
- C++ 用于检查容器类中是否存在函数和隐式推导规则的概念
- 容器类中的类迭代器
- 返回持有 std::mutex 锁的 RAII 容器类
- C++ 如何在容器类复制构造函数中复制分配器对象
- 如何使用迭代器设计模式为 C++ 中的包装容器类提供多个迭代器?
- 包含 std::string 常量的类
- 如何在模板容器类中实现复制构造函数和赋值运算符
- 在容器类中使用带有共享_ptr/unique_ptr的虚拟对象
- 在自定义容器类上反转基于范围的 for 循环
- C++ 在容器类中使用自定义比较器的排序集
- 在类组合中,使包含的类可以访问容器类变量
- 为什么 std::to_string 不支持容器类作为输入?
- 从可变参数模板容器类中调用给定可变参数的 in 和 out 方法
- 是否有不变的STL容器类
- 什么是C++中的容器类,任何人都可以举个好例子
- 支持自定义 const 本机C++容器类的"for each"
- 容器类 c++ 的循环
- C 访问容器类方法
- 具有编译时初始化的常量数据的容器类