为向量类编写 sort() 方法
Writing a sort() method for a vector class
我正在编写自己的向量类 Vector,其中包含数据成员:T* 数组、size_t vector_size 和size_t容量。我正在尝试创建一个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 <__pivot"中的"运算符<"不匹配
您提供的比较方法具有错误的签名。您需要接受 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;
}
你忘了一个康斯特!
template <class T>
bool Vector<T>::operator<(const Vector<T> & source) const // <- here
{
return (vector_size < source.vector_size);
}
一件事是在运算符的参数中使用const
,否则它无法匹配任何只读内容(这是常见情况)。
请记住,每次发生交换时,对向量的排序都会复制整个向量。 这不会特别有效。 如果向量是单独存储的,并且您有类似向量到向量的矢量,则至少排序会更快。
请务必阅读"严格弱排序"的定义。 排序与自身保持一致非常重要,否则像 std::sort() 这样的标准算法可能会严重行为不端(在某些实现中会损坏内存)。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- sort() 方法 c++ 中的比较器函数.为大量数字获得不同的解决方案
- 为向量类编写 sort() 方法
- 测试容器是否实现.at()成员访问/ std::sort兼容的正确方法