关于 std::list C++ 的问题
Questions about std::list C++
我是整个 stl 业务的新手,我有一个问题。在使用 stl 之前,我的列表节点将是这样的:
Class node
{
int duration;
string name;
node * next;
node * previous;
};
所以我的问题是,当我要使用 stl 时,我需要 node * next
和 node * previous
还是它们完全没用,因为 std::list 用它们自己的来修正它们下一个和上一个功能?
还有一个问题,你们更喜欢使用 std::list 还是自己制作?因为这将是我第一次使用 std::list 并且我很困惑。
感谢您的宝贵时间。
不,你不需要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 的性能很好,因为它们使用的分配器针对内存管理进行了优化。
经典的 "add of nodes" 例程主要实现为单个分配(使用 new (C++) 或 malloc (C))。不过,您可以通过静态数组或将数据放在向量上并指向它们来改进它。我只是告诉你,以防你想构建自己的东西并比较性能。
另请注意,您使用的是双链表。在许多情况下,每个块只需要一个迭代器 stl 具有 forward_list 容器。
不,您的 std::list
元素不需要有 next
和 previous
成员。 std::list
在内部负责此类簿记。
一般来说,我会使用标准容器而不是滚动我自己的容器,除非我有一些标准容器确实不能满足的特殊要求。如果 std::list
是最适合的 - 它通常不是,但有时是 - 我使用它。
虽然尝试创建自己的容器有一些学习价值,但从长远来看,这种事情是没有成效的 运行。标准容器 - 假设实现质量 - 比大多数人自己做的要好。
我是整个 stl 业务的新手,我有一个问题。在使用 stl 之前,我的列表节点将是这样的:
Class node
{
int duration;
string name;
node * next;
node * previous;
};
所以我的问题是,当我要使用 stl 时,我需要 node * next
和 node * previous
还是它们完全没用,因为 std::list 用它们自己的来修正它们下一个和上一个功能?
还有一个问题,你们更喜欢使用 std::list 还是自己制作?因为这将是我第一次使用 std::list 并且我很困惑。
感谢您的宝贵时间。
不,你不需要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 的性能很好,因为它们使用的分配器针对内存管理进行了优化。
经典的 "add of nodes" 例程主要实现为单个分配(使用 new (C++) 或 malloc (C))。不过,您可以通过静态数组或将数据放在向量上并指向它们来改进它。我只是告诉你,以防你想构建自己的东西并比较性能。
另请注意,您使用的是双链表。在许多情况下,每个块只需要一个迭代器 stl 具有 forward_list 容器。
不,您的 std::list
元素不需要有 next
和 previous
成员。 std::list
在内部负责此类簿记。
一般来说,我会使用标准容器而不是滚动我自己的容器,除非我有一些标准容器确实不能满足的特殊要求。如果 std::list
是最适合的 - 它通常不是,但有时是 - 我使用它。
虽然尝试创建自己的容器有一些学习价值,但从长远来看,这种事情是没有成效的 运行。标准容器 - 假设实现质量 - 比大多数人自己做的要好。