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

时间:2016-02-06 11:39:04

标签: c++ list stl std

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

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

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

还有一个问题,你们更喜欢使用std :: list还是制作自己的?因为这将是我第一次使用std :: list而且我已经非常好了。

感谢您的时间。

3 个答案:

答案 0 :(得分:4)

不,您不需要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而不是用两个成员变量定义// /static/css/blog.css body: { background: url("{% static 'images/jumbotron.jpg' %}"); } 更方便,因为我可以在定义的位置看到我的STL数据结构的元素类型。

答案 1 :(得分:0)

正如101010所说,情况就是如此。还记得stl列表的性能很好,因为它们用于那些的分配器针对内存管理进行了优化。

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

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

答案 2 :(得分:0)

不,std::list的元素不需要nextprevious成员。 std::list在内部处理此类记账。

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

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