是否有一个连续容器的惯用 C++ 类型,它允许您指定值类型(如 std::vector
和 std::array
所做的那样)和索引/大小类型?
我写了一些代码来操作很多数据数组,但是各种数组的索引可能有不同的语义,我想使用类型系统来防止我不小心使用索引错误的上下文。
例如,如果我正在管理 n
顶帽子和 m
辆汽车的集合,我可以从 0
开始为每顶帽子提供 ID最多 n-1
并且每辆汽车的 ID 从 0
到 m-1
并且有各种帽子和汽车信息,但我不会' 想不小心使用汽车 ID 在一系列帽子信息中查找内容。
car_id model_t {0};
my::vector<hat_id, fabric> hat_materials { /*...*/ }
hat_materials[model_t]; // want this to be a compile error
现在我在采取恒定时间命中和使用 std::unordered_map
或花费一些开发时间将 std::vector
包装在一个添加第二个参数的自定义容器类。
最佳答案
Is there an idiomatic C++ type for a contiguous container that lets you specify both the value type (as
std::vector
does) and the index/size type?
不。
您在这里面临的是我们必须做出的典型决定,权衡花费开发时间与使用 STL 已经提供给我们的东西之间的权衡。
在第一种情况下你将不得不花费一些时间,但希望获得更好的性能。
在第二种情况下,您的数据结构可以使用,但您可能会失去性能 w.r.t.您将要开发的数据结构。
如您所知,std::unordered_map
, 提供恒定的查询时间,因此我就是你,我会继续使用这个数据结构(通过提供自定义实体(例如 CoryKramer 建议在评论中散列),尽可能地个性化它),当项目完成时,测试性能并寻找它的瓶颈。如果它是由无序映射引起的,那么 - 根据您当时的情况,您现在可能不完全知道 - 采取行动并开发自定义数据结构如果需要,这将起到作用。
关于c++ - 在索引和值类型上参数化的惯用 vector 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45654145/