【问题标题】:Questions about std::list C++关于 std::list C++ 的问题
【发布时间】:2016-02-06 11:39:03
【问题描述】:

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

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

所以我的问题是,当我即将使用 stl 时,我是否需要 node * nextnode * previous 或者它们完全没用,因为 std::list 用它们自己的下一个和上一个函数为它们进行了修正?

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

感谢您的宝贵时间。

【问题讨论】:

  • std::list 在实践中很少使用。你的用例是什么?
  • @Karoly Horvarth 我有一个任务,与以前的相比,这次允许使用 stl,我想知道这是否是要走的路。感谢您的宝贵时间
  • “你们更喜欢使用 std::list 还是自己制作?” - 为什么要重新发明 STL?
  • 使用标准库容器,除非您有特定的理由不这样做。你的错误会更少,你的代码对其他人来说更易读,可能会表现得更好,并且(一旦你学习了标准库)你将不必复制或重写你的实现,也不必为新案例修改它们(可能会破坏它们)。
  • @KarolyHorvath:如果您有关于std::list 全球使用情况的统计数据,请分享您的信息来源。知道会很有趣。

标签: c++ list stl std


【解决方案1】:

不,你不需要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 比使用两个成员变量定义structs 更方便,因为我可以在定义的位置看到我的STL 数据结构的元素类型。

【讨论】:

  • 你觉得用stl好还是自己做list好?
  • 当有人为您编写代码(并且已经过测试)时,为什么还要编写自己的代码?享用早午餐
  • @Q_M 绝对是 STL,尤其是 std::vector
  • 有点苛刻,因为这不是问题的一部分,但我不得不对 pair 的建议投反对票。这只是为了保存结构声明而放弃了清晰度,这绝不是一个好的权衡。
  • @101010:我也喜欢fun
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多