c++中顺序插入/读取/删除最快的数据结构是什么?



我将给出大约100k坐标在一个文件中。但是元素的个数不是固定的。我想将它们存储在数据结构中,这将是插入/顺序读取/删除最快的。而数据结构在循环中依次迭代。25%到70%的元素需要去除。此外,坐标的顺序也很重要。

在这种情况下,c++中插入/顺序读取/删除最快的数据结构是什么?

答案很大程度上取决于真正将如何使用您的容器。

不要惊慌:使用typedef作为std::vector的开始(或任何其他容器,没关系),并使您的代码在容器上泛型(如STL算法所做的):

typedef std::vector<Points> Coordinates

一旦你的程序将启动并运行(你知道有多少添加/删除等…配置文件。

您可以自由地更改您的容器类型(可能是std::list<>std::deque) ,仅通过更改此typedef ,并在现实生活场景中正确基准测试每个容器。

此时,您将知道需要哪个容器。

std::list将提供最快的SEQUENTIAL插入、删除和读取。您不希望使用std::vector,因为当您执行插入时,它将不得不重新分配整个数组(除非您指定预分配的缓冲区)。

查看http://www.cplusplus.com/reference/list/list/。如您所见,std::list是一个双链表。这将允许您在常量时间内在列表的头部或尾部执行插入/删除操作。按顺序遍历list也(本质上)与遍历vector一样快。我的意思是它们都是常数时间运算。

没有足够的信息来真正建议最适合这里。你多长时间插入& &;删除吗?但有些值得思考的地方:

如果你的坐标是trivially copyable std::vector擦除实际上可以相当快的memmove。当迭代并且您想要擦除当前元素时,请对其进行memmove并减少iiterator(只要您最后执行此操作,size_t是否溢出并不重要,因为它将正确地溢出增量)。插入也是一样的,只要你注意重新分配,你应该总是reserve如果capacity() == size()

我反对std::list,我很难找到一个案例。如果你想要一个双链表的行为,你可以存储std::tuple< size_t, size_t, Coordinate >,并让前两个元素表示前一个&下一个元素。它将有更好的缓存行为,但随着时间的推移仍然会变得碎片化(在这种情况下,如果可能的话,您可以定期对其进行碎片化)。另一种方法是至少为std::list使用自定义分配器,看看boost::pool

最新更新