gpt4 book ai didi

c++ - std::sort 不适用于重载 < 运算符的用户定义对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:32 27 4
gpt4 key购买 nike

我正在编写一个类来测试不同排序算法的效率(针对大学类(class)),而我应该测试的算法是 STL 排序。为了衡量效率,我们定义了一个包含整数值的 Integer 类,并且还允许我们在每次比较或赋值时递增一个全局变量。然后我有一个驱动程序类,它测试对多个整数 vector 的 std::sort 调用。我已经在我的 Integer 类中重载了 '<' 运算符,它符合严格的弱排序(至少我很确定它符合)。然而,每次我调用排序时,我都会遇到段错误。我真的不明白为什么会这样,任何帮助将不胜感激。谢谢!

整数.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 类中的重载运算符,这会弄乱堆栈。我不确定这是错误,但似乎无法解决。

最佳答案

您的 vector[i] 的值未分配。因此,访问越界的 vector 值(例如 one[999999] )会导致未定义的行为。

使用 push_back() 为你的 std:::vector 将值分配给您的 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()) <强> sorts by default using operator< 所以保持原样。

关于c++ - std::sort 不适用于重载 < 运算符的用户定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43191321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com