基本 STL:向量列表或列表向量,在这种特殊情况下哪个更好?

Posted

技术标签:

【中文标题】基本 STL:向量列表或列表向量,在这种特殊情况下哪个更好?【英文标题】:Basic STL: list of vectors or vector of lists, what would be better in this particular case? 【发布时间】:2013-11-09 09:35:19 【问题描述】:

好的,我正在设置一个非常基本的示例议程,它具有以下特征并且行为如下:

这将是一群宇航员(宇航员班),可以从地球到月球和火星等。然后我想写下每个宇航员在每个时期的不同时期(班)星体。因此议程将有一个单独的文本文件来存储数据。以下是时期和宇航员课程,以及某人使用议程的示例:

class astronaut

    int id;
    date bday;
    vector<period> V; or list<period> L;
    bool he_dead;


class period

    int CelestialBody; //0 for earth, 1 for moon, 2 for mars, etc.
    int Establishment;
    int Duty;
    date EndDate;

某人使用它的例子:

open program
add_astronaut(01/01/2013)
close program

open program
select astronaut from list
end_period(Earth, 01/07/2013)
close program

open program
select astronaut from list
end_period(Mars, 01/01/2014)
close program

open program
select astronaut from list
end_period(Earth, 01/07/2014)
he_dead()
close program

好的,总结一下,这个想法是你永远不会从文本文件中删除任何宇航员或任何数据,它是一个寄存器,发生的所有删除都是程序在关闭之前清除其内存,然后保存到 .txt .此外,有时其他一些字段会留空,以供将来填写。

那么问题是,每个宇航员都有一个周期向量的宇航员列表,或者每个宇航员都有一个周期列表的宇航员向量,哪个更好?

我是 STL 的新手,希望能提供一些关于内存管理问题的背景说明。

【问题讨论】:

【参考方案1】:

鉴于我(尽管有限)对您正在尝试做的事情的理解,应该使用宇航员和时期的矢量。它们是“默认”的 STL 容器。如果您要在数据中间进行大量插入和删除,列表主要是有用的。

这是两者在 SO 上的一个很好的比较:vector vs. list in STL

【讨论】:

【参考方案2】:

我会为两者使用向量。

默认使用向量:只要您在容器末尾插入/删除它们就会更快,并且它们被分配给连续的内存块,因此它们在较小时使用更少的内存。

如果您的容器之一将是巨大,您还可以考虑使用deque,这将允许程序将内存分成几个较小的块。

【讨论】:

这就是我担心的问题,我加载了 3 名宇航员的列表,我选择第二个并添加一个句点,这会将向量分成两半,重新分配等。但我想这不是问题除非你超过一千万名宇航员…… @1.auxl2.1laux.2,我认为你错过了一个重要的概念。当你创建一个宇航员时,你只有一个指向周期向量的指针,指向包含周期的其他内存块,它不是一个连续的内存块。 等等,“vector V;”怎么来的是指针?我认为当你在一个类中有一个向量时,它不仅在内部而且与该类的其他成员连续分配。那这样不对吗? 是的,不正确。在内部,向量指向其他地方。必须这样做,否则该类将具有非常量的大小,这将使其无法放入向量中。

以上是关于基本 STL:向量列表或列表向量,在这种特殊情况下哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下可以避免循环吗?

我可以在初始化列表中用 10 个相同的整数初始化 STL 向量吗?

无法将元素插入到列表的向量中

字符串、列表或其他东西的向量? C++

将几何多边形内部表示提升为 STL 列表?

将地图值复制到 STL 中的向量