以下代码摘自大学图论的项目源代码(有向加权图的表示):
struct Edge
{
int neighboor : 20;
int weight : 12;
} e;
struct Node
{
double x;
double y;
vector<Edge> neighboors;
};
...
vector<Node> list;
list.resize(countNode);
有没有办法通过替换vector&lt;来节省更多内存?边缘&gt;例如一个数组? 我在想有成千上万的矢量&lt;边缘&gt;被创造,需要大量记忆,不是吗?
抱歉我的英文。提前谢谢。
答案 0 :(得分:2)
数组是具有静态长度的有序集合,向量是具有动态长度的有序集合。数组或向量是否是最节省内存的数据类型取决于您要存储的元素数。如果图中的所有元素具有相同的边数,则数组的内存效率更高,因为您可以省去可变长度存储的开销。
如果每个元素的边数变化很大,那么vector肯定是更好的选择,因为你不必在每个节点上为可能所在的边缘静态地过度分配内存,但不是。
如果边缘数量变化很小(例如,每个元素100到103个边缘),则数组可能仍然是更好的选择,因为您可以交换静态过度分配以获得动态分配和簿记的开销对于矢量的大小和容量。这个开销有多大取决于你的矢量实现,而实验是决定它是否值得的最好方法。
如果实验看起来太麻烦或者您没有足够的数据进行实验,请不要过度优化,并使用矢量。
答案 1 :(得分:2)
您可以为所有节点共享Edge矢量:
类似的东西:
struct Edge
{
int32_t neighboor : 20;
int32_t weight : 12;
} e;
struct Node
{
double x;
double y;
int32_t indexInEdges : 28;
int32_t neighboorCount : 4; // You may adjust these numbers
};
std::vector<Node> nodes;
std::vector<Edge> edges; // So edges contains the edges of nodes[0]
// then those of nodes[1] and so on.
您还可以使用float
代替double
答案 2 :(得分:2)
如果您使用C ++ 98,则可以使用数组而不是vector<Edge>
和vector<Node>
来节省大量内存。 vector
消耗的内存比实际需要的多,因为它们会在向量增长时保留一些额外的内存来减少内存重定位的数量。
如果您使用C ++ 11,则可以使用vector::shrink_to_fit()
释放未使用的内存。