我应该总是使用带有自己索引的一维向量,还是多维向量?

时间:2013-03-27 17:53:52

标签: c++ vector multidimensional-array

我正在存储和生成一些自然用维度>表示的数据。 1.但是,我看到许多答案建议程序员使用带有自己的自定义索引的1D向量来表示多维度。我的问题是:只使用1维度可以获得什么?

在我当前的项目中,性能是一个优先级(我首先知道代码,然后是配置文件,但是为了速度,这个项目正在从另一种语言导入到C ++中)。我可以看到只有一个矢量对象可以减少开销,但它是否比频繁计算索引更多?我看到一个答案提到使用嵌套向量:

vector < vector<int> > 

new进行大量调用。我能看出这是多么令人不安,这是真的吗?

1 个答案:

答案 0 :(得分:4)

首先,std::vector<std::vector<int>>可以有不同大小的内部向量。但是,我假设您正在专门讨论使用此类型来模拟2D数组。假设您在创建向量时设置了向量的大小,您可能不需要担心动态分配的数量,因为它们都是一次性发生的。

向量在内部分配其元素的数组。因此外部向量分配一个向量数组,每个内部向量分配一个int s数组。你可以这样想:

┌─────┐
│ vec │
└──╂──┘
   ┃
   ▼
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ vec │ vec │ vec │ vec │ vec │ vec │ vec │ vec │ vec │
└──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┴──╂──┘
   ┃     ┗━━━━━━━━━━┓
   ▼                ▼
┌─────┬─────┬┄   ┌─────┬─────┬┄
│ int │ int │    │ int │ int │
└─────┴─────┴┄   └─────┴─────┴┄

如您所见,int的数组完全相互独立。它们可能处于完全不同的记忆位置。这称为碎片。它们几乎肯定不会在一个连续的内存块中。因此,访问2D矢量的不同“行”中的元素可能会导致缓存未命中。

但是,如果你分配一个int s的矢量并进行自己的二维索引,你的内存布局更像是这样:

┌─────┐
│ vec │
└──╂──┘
   ┃
   ▼
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬┄
│ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴┄

int现在存储在单个连续的内存块中。任何访问都可能具有类似的内存地址并导致缓存命中。这可能会为您带来性能提升。

相关问题