我应该总是用一个有自己索引的一维向量,还是一个多维向量
Should I always use a 1D vector with my own indexing, or is a multi-dimensional vector ok?
我正在存储和生成一些用维度> 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
现在存储在一个连续的内存块中。任何访问都可能具有相似的内存地址,并导致缓存命中。
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为什么一个向量上的多线程操作很慢
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 制作一对共享指针并推送一个向量
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 为什么我们需要在优先级队列声明中添加一个向量作为参数?
- 如何将所有指针从一个向量移动到另一个向量?
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 使用步骤c++构建一个向量
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 将一个向量对放在一个无序映射与一个映射中