具有任意索引的数组的C ++类

时间:2010-02-22 16:00:03

标签: c++ arrays indices

任何流行的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;
}

...谢谢

4 个答案:

答案 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派生,请参阅评论。