C++中为STL算法实现透明索引的优化方案问询
简化基于索引的STL算法间接访问实现
需求背景
我需要借助STL算法简化索引操作:现有一组对应另一std::vector容器的int型索引数组,索引已按对应容器的值排序。期望实现通过索引透明访问数据——比如无需编写自定义谓词就能用std::equal_range查找数据范围,当前的自定义谓词仅用来存储容器引用、实现间接访问。
规避要求
- 使用STL算法时,避免同时传入数据容器和索引两个参数
- 优先使用int型索引而非指针/迭代器:Winx64下int占4字节,比指针省一半内存,且索引更便于数组重定位、适配SoA(数组结构)等场景
当前实现与问题
目前的方案是用带状态的谓词来传递容器引用,示例代码如下:
struct Value { int data; public: Value(int value) : data(value) {} operator int() const { return data; } bool operator < (const Value& rhs) const { return data < int(rhs); } }; struct Index { public: int index; public: Index(int i) : index(i) {} }; class Comparator { const std::vector<Value>& vec; public: Comparator(const std::vector<Value>& vec) : vec(vec) {} bool operator () (const Value& lhs, const Index& rhs) const { return lhs < vec[rhs.index]; } bool operator () (const Index& lhs, const Value& rhs) const { return vec[lhs.index] < rhs; } }; int main() { std::vector<Value> v1 = { 0,30,20,40,10 }; std::vector<Index> i1 = { 0,4,2,1,3 }; Value value(30); auto range_pred = std::equal_range(i1.begin(), i1.end(), value, Comparator(v1)); std::cout << std::endl << "With predicate:" << std::endl; std::cout << "*range_pred.first = " << v1[(*range_pred.first).index] << std::endl; std::cout << "*range_pred.second= " << v1[(*range_pred.second).index] << std::endl; std::cout << std::endl << "range_pred.second-range_pred.first " << std::distance(range_pred.first, range_pred.second) << std::endl; }
核心问题
- 每次使用STL算法都必须手动传入定制的谓词,因为只有它能存储容器的引用
- 一旦遗漏谓词,会触发难以排查的STL内部错误
核心疑问
- 现代C++中有没有更简洁的实现方式?
- 存储容器引用的最优位置是带状态的谓词吗?
- 如何实现类似虚构
std::indirect的透明机制,让开发者无需关注间接访问的细节?
期望目标
- 健壮性:避免因遗漏谓词导致的错误,防止隐式转换破坏间接访问逻辑
- 可读性与复用性:消除代码冗余,简化多层间接访问的实现
- 性能与内存平衡:兼顾内存占用(保持int型索引的优势)和算法执行性能
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

