我正在编写自己的矢量类Vector,其数据成员为:T * array,size_t vector_size和size_t capacity。我正在尝试创建一个sort()方法:
template <class T>
void Vector<T>::sort(bool ascending)
{
std::sort(array,array+vector_size);
if(ascending==false)
std::reverse(array,array+vector_size);
}
当数组中的元素是int,char等类型时,它工作正常。但是当我尝试对包含Vector元素的向量进行排序时,它将无法编译。
根据我的阅读,我需要以某种方式定义<
运算符,但我真的不知道该怎么做......
我试过了:
template <class T>
bool Vector<T>::operator<(Vector<T> & source) const
{
return (vector_size < source.vector_size);
}
我的主要看起来像这样:
int main() {
Vector<int> v1(5,1);
Vector<int> v2(7,2);
Vector<int> v3(3,3);
Vector<Vector<int>> v4;
v4 = {v1,v2,v3};
v4.sort(1);
return 0;
}
这是我得到的错误之一:
/ usr / include / c ++ / 4.6 / bits / stl_algo.h:2212:4:错误:'* __first&lt;中'运算符&lt;'不匹配__pivot”
答案 0 :(得分:3)
您提供了一个带有错误签名的比较方法。您需要接受const引用或值,但不能接受对您的类型的(可修改的)引用,而前者应该是首选,除非它是基本类型。因此,比较方法的签名应如下所示:
template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const
{
return (vector_size < source.vector_size);
}
这是因为std::sort
(以及许多其他方法)旨在不修改内容。如果它们取值(但对于大型类型来说这将是慢的)或const引用,这是有保证的。
请注意,您定义了比较方法以比较矢量的大小,而不是它们的内容。你的所有向量都是相同的长度。所以他们被std::sort
视为平等。所以std::sort
不会改变v4
...如果你打算以类似于字符串比较的方式比较内容(第一个条目先计数,如果相等,则取下一个,依此类推...... 。),使用这个:
template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const
{
for(int i = 0; i < size && i < source.size; ++i) {
if(*this[i] < source[i])
return true;
else if(source[i] < *this[i])
return false;
}
// You have to decide what to do if the length isn't equal.
// But if the vectors are really equal than return false:
if(size == source.size)
return false;
}
答案 1 :(得分:1)
你忘记了一个常量!
template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const // <- here
{
return (vector_size < source.vector_size);
}
答案 2 :(得分:1)
您需要的一件事是在参数中使用const
给运算符,否则它不能匹配只读的任何内容(这是常见的情况)。
请记住,每次交换发生时,矢量排序向量都会复制整个向量。这不会特别有效。如果向量是单独存储的,并且你有像向量指针一样的向量,那么至少排序会更快。
一定要阅读“严格弱排序”的定义。排序与自身一致是非常重要的,或者标准算法如std :: sort()可能会严重行为不端(在某些实现中会破坏内存)。