std::sort 不适用于带有 oveload <运算符的用户定义对象
std::sort Doesn't work for User-Defined Object with oveloaded < operator
我正在编写一个类来测试不同排序算法(对于大学课程)的效率,而我应该测试的算法是STL排序。为了衡量效率,我们定义了一个保存整数值的类 Integer,并且还允许我们在每次比较或分配全局变量时递增全局变量。然后我有一个驱动程序类,用于在整数的多个向量上测试 std::sort 调用。我已经在我的 Integer 类中重载了"<"运算符,它符合严格的弱排序(至少我很确定它确实如此)。但是,每次我调用sort时,我都会遇到分段错误。我真的不知道为什么会发生这种情况,任何帮助将不胜感激。谢谢!
整数.cpp
#include "Integer.h"
int Integer_count;
//Default Constructor
Integer::Integer() {
val = 0;
}
//Specified Constructor
Integer::Integer(int x) {
val = x;
}
//Copy-Constructor
Integer::Integer(const Integer &cp) {
Integer_count++;
val = cp.val;
}
//Return the Integer's value
int Integer::value() {
return val;
}
//Less-than (<) operator overload
bool Integer::operator < (const Integer& obj) const {
Integer_count++;
return (val < obj.val);
}
//Assignment (=) operator overload
void Integer::operator = (const Integer& obj) {
Integer_count++;
val=obj.val;
}
驱动程序.cpp
#include <iostream>
#include <cstdlib>
#include <vector>
#include "Integer.h"
#include "Sorter.cpp"
srand (time(NULL)); //Seed the random number generator
std::vector<Integer> one;
std::vector<Integer> two;
std::vector<Integer> three;
std::vector<Integer> four;
std::vector<Integer> five;
for(int i=0; i<10000; i++){
one[i] = Integer(i);
two[i] = Integer(10000-i);
three[i] = Integer(rand() % (10000+1));
four[i] = Integer(rand() % (10000+1));
five[i] = Integer(rand() % (10000+1));
}
//Sort function called from the STL
//Sorted Array
std::sort(one.begin(), one.end());
std::cout << "STL for Sorted Array: " << Integer_count << std::endl;
基本上,我认为 std::sort 函数没有使用我的 Integer 类中的重载运算符,这会弄乱堆栈。我不确定这是错误,但似乎无法解决它。
你的向量[i]的值没有被分配。因此,访问越界的向量值(例如one[999999]
)会导致未定义的行为。
使用push_back()
为您的std:::vector
分配和分配值到您的向量:
for(int i=0; i<10000; i++){
one.push_back(Integer(i));
two.push_back(Integer(10000-i));
three.push_back(Integer(rand() % (10000+1)));
four.push_back(Integer(rand() % (10000+1)));
five.push_back(Integer(rand() % (10000+1)));
}
这将解决分段故障。 至于排序,一旦你有值。
默认情况下,std::sort(one.begin(), one.end())
使用operator<
进行排序,因此请保持原样。
>std::vector::operator[]
从不将新元素插入容器中,也不执行边界检查(vector/operator_at)。如果您访问的元素越界会导致未定义的行为,这就是您的情况。
您必须使用std::vector::emplace_back
或std::vector::push_back
,另一种选择是使用构造容器的构造函数explicit vector<T>(size_type count);
count
其中包含T
的默认插入实例:
第一个选项:
std::vector<Integer> one;
one.reserve(10000);
std::vector<Integer> two;
two.reserve(10000);
std::vector<Integer> three;
three.reserve(10000);
std::vector<Integer> four;
four.reserve(10000);
std::vector<Integer> five;
five.reserve(10000);
for (int i = 0; i < 10000; ++i) {
one.emplace_back(i);
two.emplace_back(10000 - i);
three.emplace_back(rand() % (10000+1));
four.emplace_back(rand() % (10000+1));
five.emplace_back(rand() % (10000+1));
}
第二种选择:
std::vector<Integer> one(10000);
std::vector<Integer> two(10000);
std::vector<Integer> three(10000);
std::vector<Integer> four(10000);
std::vector<Integer> five(10000);
for (int i = 0; i < 10000; ++i) {
one[i] = Integer(i);
two[i] = Integer(10000-i);
three[i] = Integer(rand() % (10000+1));
four[i] = Integer(rand() % (10000+1));
five[i] = Integer(rand() % (10000+1));
}
std::sort(one.begin(), one.end())
必须奏效。
您没有在向量中推送/附加元素。如果不分配空间或推回,您就无法以这种方式在向量中添加元素(由于分配/数组越界错误,我的 clang 编译器会产生运行时错误)。请改用push_back
。
快速测试 -
std::vector<Integer> arr{Integer(1), Integer(4), Integer(3)};
sort(arr.begin(), arr.end());
// now print Integer_count
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 如何正确实现和访问运算符的各种自定义枚举器
- 自定义先决条件对移动分配运算符有效吗
- 在运算符重载定义中使用成员函数(const错误)
- g++用户定义的动态链接库上的全局new和delete运算符
- 一元"运算符"未在C++中定义
- STL按客户"<"运算符对向量进行排序。为什么要将"<"运算符定义为 const?
- 如何将运算符定义从头文件添加到现有结构?
- 在使用具有相等运算符定义的抽象类时,如何定义父类以减少代码重复?
- 当我们没有将运算符+定义为朋友时?C++
- 没有返回值的c++类成员运算符定义
- 用指向对象的指针和c++中的new运算符定义对象
- <T> 仅为具有运算符/定义的此类 T 创建模板
- 基类中的运算符定义
- C++:不同名称空间中的多个运算符定义
- 运算符定义不能正常工作
- 类运算符'='定义
- 为什么VS不为逻辑运算符定义可选的令牌?
- std::equal_range 不适用于具有运算符<定义的结构