我最近从头开始编写我的第一个程序,但不是该领域的专业人员,我担心我可能没有使用最合适的解决方案。
在我的程序中,我必须使用对象的列表(和列表列表),我不断添加和删除元素,不一定在列表的开头或结尾。
使用指针列表不是一个选项,只能提供要求。
当我开始时,我只知道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
无缝替换为任何其他标准容器?
我有什么特别的问题需要注意吗?
答案 0 :(得分:4)
你能为我的范围推荐最好的容器/双链表吗?
如果按索引访问元素,则链表不是一个好的解决方案:您必须从头开始遍历列表,因此它是O(N)操作。因此,std::list
和std::forward_list
在其界面中没有此类访问权限。
是否可以用任何其他标准容器无缝替换std :: vector?
没有std::list
,因为它没有索引访问权限。 std::deque
可以适合,但前提是你不依赖于一个连续块中的基础数据(我假设你没有,因为你问的是链接列表)
我有什么特别的问题需要注意吗?
与性能一样,您首先应该确定是否有问题。 如果您遇到std::vector
的性能问题,请尝试其他方法,并衡量在实际运行方案中的性能差异。不同容器的性能特征可能非常直观,因此测量在这里特别重要。
相关链接:std::vector vs. std::list vs. std::deque comparison。 Bjarne Stroustrup的Going Native 2012 keynote speech。
答案 1 :(得分:2)
Boost提供了另一种选择:boost::stable_vector。
Big O复杂度对于所有操作都是完全相同的,但是在内部它不会改变元素而是指针(以丢失连续性为代价)。
对于每次访问时一次额外间接的费用,stable_vector
在两种情况下是一个很好的选择:
显然,后者应该通过剖析器指出问题来证实。