我将给出大约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并减少i
或iterator
(只要您最后执行此操作,size_t
是否溢出并不重要,因为它将正确地溢出增量)。插入也是一样的,只要你注意重新分配,你应该总是reserve
如果capacity() == size()
。
我反对std::list
,我很难找到一个案例。如果你想要一个双链表的行为,你可以存储std::tuple< size_t, size_t, Coordinate >
,并让前两个元素表示前一个&下一个元素。它将有更好的缓存行为,但随着时间的推移仍然会变得碎片化(在这种情况下,如果可能的话,您可以定期对其进行碎片化)。另一种方法是至少为std::list
使用自定义分配器,看看boost::pool
。