现在我正在编写一些解决车辆路径问题的代码。为此,一个重要的决定是选择如何编码解决方案。解决方案包含多条路线,每条路线一条。每条路线都有客户来访顺序,路线负荷,路线长度。 要对解决方案的信息进行修改,我还需要快速找到一些信息。
例如,
客户在哪条路线?
客户做什么路线?
路线中有多少个节点?
节点前面或后面有哪些节点?
现在,我正在考虑使用以下结构来保持解决方案。
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之间。
我听说可以使用动态数组来完成这项工作。但在我看来,动态数组更复杂。一个人必须找到内存并释放内存。在这里,我的问题是双重的。
如何使用动态数组实现相同的目的?如何定义结构或类,以便可以轻松处理内存位置和释放?
使用动态数组会比使用矢量更快吗?假设解决方案结构需要访问数百万次。
答案 0 :(得分:6)
你不太可能在动态数组和向量之间看到明显的性能差异,因为后者基本上是围绕前者的非常薄的包装器。另外请注意,使用vector
会明显减少错误。
std::map
中。以下可能是您感兴趣的:What are the complexity guarantees of the standard containers?
重要的是要考虑使用的容器类型。但是,当涉及微优化(例如向量与动态数组)时,最好的策略是首先对代码进行分析,而只关注那些证明是真实的 - 而不是假设 - 代码的部分代码。 / p>
答案 1 :(得分:1)
矢量的代码很可能比你自己编写的动态数组代码更好,更高效。只有在分析显示在vector
中花费大量时间时,我才会考虑编写自己的容易出错的替换。另请参阅Dynamically allocated arrays or std::vector
答案 2 :(得分:0)
我正在使用MSVC,并且实现看起来尽可能快。
通过operator []访问数组是:
return (*(this->_Myfirst + _Pos));
与动态内存一样快。
你要获得的唯一开销是在向量的内存使用中,它似乎创建了一个指向向量开始,向量结束和当前序列结束的指针。如果您使用动态数组,这只是您需要的2个指针。你只创造了200-2000这些,我怀疑记忆会变得那么紧张。
我确信其他stl实现非常相似。我会吸收矢量存储的次要成本,并在项目中使用它们。