繁体   English   中英

关于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用它们自己的next和previous函数来补偿它们?

还有一个问题,你们喜欢使用std :: list还是自己制作? 因为这将是我第一次使用std :: list和Im,我对此感到非常困惑。

谢谢你的时间。

不,您不需要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的性能很好,因为用于它们的分配器针对内存管理进行了优化。

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

另外请注意,您正在使用双向链接列表。 在许多情况下,每个块仅需要一个迭代器,而stl具有forward_list容器。

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

通常,除非我对标准容器确实不能满足某些特殊要求,否则我将使用标准容器而不是自己动手使用。 如果std::list是最合适的-通常不是,但是有时-我使用它。

尽管尝试创建自己的容器有一定的学习价值,但从长远来看,这种事情是无济于事的。 标准容器(假设实施质量很高)比大多数人自己能做的更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM