我最近从头开始编写了我的第一个程序,但作为该领域的专业人士,我担心我可能没有使用最合适的解决方案。
在我的程序中,我必须使用对象列表(和列表列表),我在其中连续添加和删除元素,不一定在列表的开头或结尾。
使用指针列表不是一种选择,给出了要求。
当我开始时,我只知道 std::vector
类,因此我使用了它,尽管我知道它需要连续的内存,因此这种选择会导致重复的重新分配。
在尝试解决另一个问题时,我发现存在可能更适合此任务的其他类,例如 std::list
和 std::deque
。
我主要通过索引访问对象
myvector[index].function();
我最常使用的标准函数是
myvector.size();
myvector.begin();
myvector.pop_back();
myvector.push_back();
myvector.insert(myvector.begin()+offset, number, new_element);
而且我没有重载任何函数/运算符。
你能为我的范围推荐最好的容器/双向链表吗?
是否可以将 std::vector
无缝替换为任何其他标准容器?
有什么特别需要注意的地方吗?
最佳答案
Could you suggest the best container/doubly-linked list for my scope?
如果你通过索引访问元素,链表不是一个好的解决方案:你必须从头开始遍历列表,所以它是一个 O(N) 操作。由于这个原因,std::list
和 std::forward_list
在它们的接口(interface)中没有这样的访问权限。
Is it possible to seamlessly substitute std::vector with any other standard container?
不适用于 std::list
,因为它无法通过索引访问。 std::deque
可能 是合适的,但前提是你不依赖于一个连续 block 中的基础数据(我假设你不依赖,因为你在问关于链表)
Are there special issues I have to pay attention to?
与性能一样,您应该首先确定您是否有问题。 如果您遇到 std::vector
的性能问题,请尝试其他方法,并测量实际运行场景中的性能差异。不同容器的性能特征可能非常反直觉,因此测量在这里尤为重要。
相关链接:std::vector vs. std::list vs. std::deque comparison . Bjarne Stroustrup 的 Going Native 2012 keynote speech .
关于c++ - 用更合适的类替换 `std::vector`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16933850/