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

Should I always use a 1D vector with my own indexing, or is a multi-dimensional vector ok?

本文关键字:一个 向量 一维 我应该 自己 索引      更新时间:2023-10-16

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

在我目前的项目中,性能是优先考虑的(我首先知道代码,然后是概要文件,但是这个项目是从另一种语言导入到c++中以提高速度)。我可以看到,只有一个向量对象可以减少开销,但这比频繁计算索引要多得多吗?我看到一个答案提到使用嵌套向量:

vector < vector<int> > 

导致大量呼叫new。我能看出这有多麻烦,这是真的吗?

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

vector在内部分配一个包含其元素的数组。所以外部向量是分配一个向量数组每个内部向量是分配一个int数组。你可以这样想:

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

可以看到,int s的数组彼此完全分开。它们可能位于记忆中完全不同的位置。这被称为碎片化。它们几乎肯定不会在一个连续的内存块中。因此,在2D向量的不同"行"中访问元素可能会导致缓存丢失。

然而,如果你分配一个int s的向量,并做你自己的二维索引,你的内存布局更像这样:

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

int现在存储在一个连续的内存块中。任何访问都可能具有相似的内存地址,并导致缓存命中。