任何流行的C ++库是否都有一个类(或类)允许开发人员在不牺牲速度的情况下使用具有任意索引的数组?
为了更具体地提出这个问题,我希望能够编写类似下面的代码:
//An array with indices in [-5,6)
ArbitraryIndicesArray<int> a = ArbitraryIndicesArray<int>(-5,6);
for(int index = -5;index < 6;++index)
{
a[index] = index;
}
...谢谢
答案 0 :(得分:6)
你真的应该使用带偏移的矢量。甚至是带偏移的数组。额外的加法或减法不会对程序的执行速度产生任何影响。
如果你想要一个与默认C数组完全相同的速度,你可以将偏移量应用于数组指针:
int* a = new int[10];
a = a + 5;
a[-1] = 1;
但是,不建议这样做。如果你真的想这样做,你应该创建一个包含内联函数的包装类,它隐藏了可怕的代码。您可以保持C代码的速度,但最终能够添加更多错误检查。
如评论中所述,在更改数组指针后,您无法使用该指针进行删除。您必须将其重置为阵列的实际开始。另一种方法是始终将指针保持在开头但使用另一个修改过的指针。
//resetting the array by adding the offset (of -5)
delete [] (a - 5);
答案 1 :(得分:4)
std::vector<int>
可以解决这个问题
对向量中单个元素的随机访问只是O(1)。
如果你真的需要自定义索引,你可以根据矢量创建自己的小类来应用一个副词。
答案 2 :(得分:2)
使用STL中的地图类:
std::map<int, int> a;
for( int index = -5; index < 6; ++index )
{
a[index] = index;
}
map在内部实现为一个已排序的容器,它使用二进制搜索来查找项目。
答案 3 :(得分:0)
编辑答案,因为我不是很聪明。
将std::vector
和偏移量包装到班级中并提供operator[]
:
template <class T>
class ArbVector
{
private:
int _offset;
std::vector<T> container;
public:
ArbVector(int offset) : _offset(offset) {}
T& operator[](int n) { return container[n + _offset] }
};
不确定这是否会编译,但你明白了。
请勿从std::vector
派生,请参阅评论。