矢量和动态数组,在速度上有很大区别吗
Vector versus dynamic array, does it make a big difference in speed?
现在我正在编写一些代码来解决车辆路线问题。为此,一个重要的决定是选择如何对解决方案进行编码。一个解决方案包含多条路线,每辆车一条。每条路线都有客户拜访顺序,路线的负载,路线的长度。为了对解决方案的信息执行修改,我还需要快速找到一些信息。
例如,
客户在哪条路线上?
一条路线有什么样的顾客?
一条路线上有多少个节点?
什么节点在节点的前面或后面?
现在,我想用下面的结构来保存一个解决方案。
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实现是非常相似的。我会吸收矢量存储的小成本,并在您的项目中使用它们。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 为什么在读取文件大小时文件IO速度会发生变化
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 返回递归调用和仅递归调用的区别
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 矢量和动态数组,在速度上有很大区别吗
- SDL_HWSURFACE和SDL_SWSURFACE在速度和性能方面有什么区别吗?