矢量和动态数组,在速度上有很大区别吗

Vector versus dynamic array, does it make a big difference in speed?

本文关键字:区别 速度 动态 数组      更新时间:2023-10-16

现在我正在编写一些代码来解决车辆路线问题。为此,一个重要的决定是选择如何对解决方案进行编码。一个解决方案包含多条路线,每辆车一条。每条路线都有客户拜访顺序,路线的负载,路线的长度。为了对解决方案的信息执行修改,我还需要快速找到一些信息。

例如,


客户在哪条路线上?
一条路线有什么样的顾客?
一条路线上有多少个节点?
什么节点在节点的前面或后面?

现在,我想用下面的结构来保存一个解决方案。

struct Sol
{
    vector<short> nextNode;   // show what is the next node of each node;
    vector<short> preNode;    //show what is the preceding node
    vector<short> startNode; 
    vector<short> rutNum;
    vector<short> rutLoad;
    vector<float> rutLength;
    vector<short> rutSize;
};

每个向量的一般大小与实例有关,在200-2000之间。

我听说可以使用动态数组来完成这项工作。但在我看来,动态数组更复杂。一个人必须找到记忆并释放它。我的问题有两个方面。

如何使用动态数组来实现同样的目的?如何定义结构或类,使内存位置和释放可以很容易地照顾?

将使用动态数组比使用向量更快?假设解决方案结构需要被访问百万次

动态数组和矢量之间不太可能看到明显的性能差异,因为后者本质上是对前者的一个非常薄的包装。还要记住,使用vector将大大减少出错的可能性。

然而,也有可能某些信息最好完全存储在另一种类型的容器中,例如,在std::map中。以下内容可能会引起您的兴趣:标准容器的复杂性保证是什么?

考虑使用的容器类型是很重要的。然而,当涉及到微优化(如向量vs动态数组)时,最好的策略是首先分析代码,并且只关注那些被证明是真实的(而不是假设的)瓶颈的代码部分。

很可能vector的代码实际上比您自己编写的动态数组代码更好,性能更高。只有当分析显示在vector中花费了大量时间时,我才会考虑编写自己的容易出错的替代品。参见动态分配数组或std::vector

我正在使用MSVC,并且实现看起来尽可能快。

通过操作符[]访问数组是:

return (*(this->_Myfirst + _Pos));

和动态内存一样快

你将得到的唯一开销是在vector的内存使用中,它似乎创建了一个指向vector的开始,vector的结束和当前序列的结束的指针。如果使用动态数组,只需要多2个指针。你只创建了200-2000个这样的文件,我怀疑内存是否会那么紧张。

我确信其他的stl实现是非常相似的。我会吸收矢量存储的小成本,并在您的项目中使用它们。