3

是否有任何流行的 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

5 回答 5

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);
于 2010-02-22T16:13:25.317 回答
4

Astd::vector<int>会在这里解决问题。
对向量中单个元素的随机访问仅为 O(1)。

如果您真的需要自定义索引,您可以基于向量创建自己的小类以应用偏移量。

于 2010-02-22T16:10:34.657 回答
2

使用 STL 中的地图类:

std::map<int, int> a;
for( int index = -5; index < 6; ++index )
{ 
    a[index] = index; 
}

map 在内部实现为排序容器,它使用二进制搜索来定位项目。

于 2010-02-22T16:08:33.540 回答
1

[这是一个旧线程,但仅供参考......]

Boost.MultiArray具有用于设置任何索引范围的范围系统。

ObjexxFCL库中的数组完全支持任意索引范围。

这些都是多维数组库。对于 OP 1D 数组需要上面的 std::vector 包装器就足够了。

于 2015-04-29T22:24:06.807 回答
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,请参阅评论。

于 2010-02-22T16:20:02.613 回答