[英]Questions about std::list C++
我是整个Stl业务的新手,我有一个问题。 在使用stl之前,我的列表节点将是这样的:
Class node
{
int duration;
string name;
node * next;
node * previous;
};
所以我的问题是,当我要使用stl时,我是否需要node * next
和node * previous
否则它们完全没有用,因为std :: list用它们自己的next和previous函数来补偿它们?
还有一个问题,你们喜欢使用std :: list还是自己制作? 因为这将是我第一次使用std :: list和Im,我对此感到非常困惑。
谢谢你的时间。
不,您不需要next
和previous
, std::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
元素不需要具有next
和previous
成员。 std::list
内部负责此类记账。
通常,除非我对标准容器确实不能满足某些特殊要求,否则我将使用标准容器而不是自己动手使用。 如果std::list
是最合适的-通常不是,但是有时-我使用它。
尽管尝试创建自己的容器有一定的学习价值,但从长远来看,这种事情是无济于事的。 标准容器(假设实施质量很高)比大多数人自己能做的更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.