【发布时间】:2015-03-17 15:31:01
【问题描述】:
我编写了一个包含 std::vector 的模板,以确保该向量始终是排序的:
template <typename T> class SortedVector{
public:
SortedVector(bool (*comparator)(T,T)=DefaultComparator<T>){
this->comparator = comparator;
}
void insertValue(T newElement){
vect.insert(std::lower_bound(
vect.begin(),vect.end(),newElement,comparator),newElement);
}
private:
std::vector<T> vect;
bool (*comparator)(T,T);
};
我希望能够使用自定义比较器,但在大多数情况下,只需使用 T 的 < 运算符就可以了。但是,我没有找到比使用它更好的方法
template <typename T> bool DefaultComparator(T a,T b){return a<b;}
作为默认参数。
也许这是一个愚蠢的问题...如果不定义我自己的DefaultComparator,难道没有更好的方法来获得相同的结果吗?
我不能使用 C++11。
【问题讨论】:
-
使用
std::less。如果没有,自己写一个也很简单。 -
我喜欢的一个变体是
vector,只有当人们阅读它时才会排序。写入它不会对其进行排序。因此,您跟踪前缀排序位置的“高水位”标记,并在阅读时首先对“未排序”部分进行排序,然后与“已排序”部分进行合并。如果您的用例是“添加一堆数据,然后大量检查”,而不是“编辑、检查、编辑、检查”,那么这会产生非常好的性能。您的实现在两者上的性能都非常差。 -
@Yakk 我对这个类的实际应用是我必须遍历数百万个元素(太多且太大而无法放入任何合理的向量)并只保留
N最低的元素。因此,首先填充然后排序不是一种选择,否则会导致一些过于复杂的事情,因为无论如何从文件中读取这些元素而不是其他任何东西都会减慢应用程序的速度。 -
@Yakk 实际上,这个问题是this one 的后续问题。如果您能对这个问题发表评论/回答会很好,因为这里的这个问题实际上只是关于比较器。
-
@tobi303 正如我在那里提到的,使用排序向量来查找最低的 100 个项目也是一个坏主意。它是
O( m n lg n ),其中m是总元素,n是极限。您可以在O( m lg n )中进行操作。