【发布时间】:2014-07-04 02:52:53
【问题描述】:
在 C++ 中,列表数据结构有一个合并功能,它基本上删除源列表中的所有对象并放入目标列表。
// source list will be empty after this operation
destinationList.merge(sourceList);
根据教程/示例,列表必须在合并操作之前进行排序。
destinationList.sort();
sourceList.sort();
destinationList.merge(sourceList);
我很困惑,因为如果有排序列表的要求,为什么 C++ 不通过在合并函数中调用排序函数来强制它?
另外,我可以先合并未排序的列表,然后我可以排序合并的列表,这不一样吗?
destinationList.merge(sourceList);
destinationList.sort();
【问题讨论】:
-
如果顺序不重要,可以使用
dst.insert(dst.end(), src.begin(), src.end()); src.clear(); -
如果
merge应该先排序,算法的复杂度是不一样的。 -
某些列表可能已经排序,因此在合并之前无需调用 sort。如果 STL 在合并之前调用排序,那么它将执行不必要的排序。基本上,代码执行它在锡上所说的:排序排序和合并合并。由您决定是否输入智能,即在合并之前进行排序。
-
我会指出
list::sort在比较方面可能只是 O(n*log(n)),但在迭代方面它是低效的(在内存中来回移动)到一个随机访问容器,例如vector或deque。我将您推荐给How can I efficiently select a standard library container in C++11,作为如何选择最合适容器的快速指南。
标签: c++ list linked-list