关于 std::list C++ 的问题

Questions about std::list C++

我是整个 stl 业务的新手,我有一个问题。在使用 stl 之前,我的列表节点将是这样的:

Class node
{
    int duration;
    string name;
    node * next;
    node * previous;
};

所以我的问题是,当我要使用 stl 时,我需要 node * nextnode * previous 还是它们完全没用,因为 std::list 用它们自己的来修正它们下一个和上一个功能?

还有一个问题,你们更喜欢使用 std::list 还是自己制作?因为这将是我第一次使用 std::list 并且我很困惑。

感谢您的宝贵时间。

不,你不需要nextpreviousstd::list内部实现了整个链表机制。只是:

Class node {
  int duration;
  string name;
};

并将您的列表定义为:

std::list<node> myList;

最好使用 std::vector 而不是 std::list,它在大多数情况下都优于 std::list,因为它对缓存更友好。

std::vector<node> myVec;

另一种选择是使用 std::pair 而不是定义您自己的 struct:

std::list<std::pair<int, std::string>> myList;

然而,这里使用 std::pair 显然是主观的。我发现使用 std::pair 而不是用两个成员变量定义 struct 更方便,因为我可以在定义的地方看到我的 STL 数据结构的元素类型。

正如101010所说,是这样的。还要记住 stl list 的性能很好,因为它们使用的分配器针对内存管理进行了优化。

经典的 "add of nodes" 例程主要实现为单个分配(使用 new (C++) 或 malloc (C))。不过,您可以通过静态数组或将数据放在向量上并指向它们来改进它。我只是告诉你,以防你想构建自己的东西并比较性能。

另请注意,您使用的是双链表。在许多情况下,每个块只需要一个迭代器 stl 具有 forward_list 容器。

不,您的 std::list 元素不需要有 nextprevious 成员。 std::list 在内部负责此类簿记。

一般来说,我会使用标准容器而不是滚动我自己的容器,除非我有一些标准容器确实不能满足的特殊要求。如果 std::list 是最适合的 - 它通常不是,但有时是 - 我使用它。

虽然尝试创建自己的容器有一些学习价值,但从长远来看,这种事情是没有成效的 运行。标准容器 - 假设实现质量 - 比大多数人自己做的要好。