用更合适的类代替`std :: vector`

时间:2013-06-05 07:22:49

标签: c++ vector doubly-linked-list

我最近从头开始编写我的第一个程序,但不是该领域的专业人员,我担心我可能没有使用最合适的解决方案。

在我的程序中,我必须使用对象的列表(和列表列表),我不断添加和删除元素,不一定在列表的开头或结尾。
使用指针列表不是一个选项,只能提供要求。

当我开始时,我只知道std::vector类,因此我使用它,尽管知道它需要连续的记忆,因此这种选择会导致重复的重新分配。
在尝试解决另一个问题时,我发现存在可能更适合此任务的其他类,例如std::liststd::deque

我主要通过使用索引来访问对象

myvector[index].function();

和我最常用的标准功能是

myvector.size();
myvector.begin();
myvector.pop_back();
myvector.push_back();
myvector.insert(myvector.begin()+offset, number, new_element);

我没有重载任何函数/运算符。

你能为我的范围建议最好的容器/双链表吗? 是否可以将std::vector无缝替换为任何其他标准容器? 我有什么特别的问题需要注意吗?

2 个答案:

答案 0 :(得分:4)

  

你能为我的范围推荐最好的容器/双链表吗?

如果按索引访问元素,则链表不是一个好的解决方案:您必须从头开始遍历列表,因此它是O(N)操作。因此,std::liststd::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在两种情况下是一个很好的选择:

  • 你想拥有一个稳定的元素地址,所以你可以保留一个参考/指针
  • 该元素的复制成本极高,因此无论您正在进行什么操作,都要保证不会发生任何复制

显然,后者应该通过剖析器指出问题来证实。