C++ 标准::排序不';无法使用oveload处理用户定义的对象<;操作人员

C++ 标准::排序不';无法使用oveload处理用户定义的对象<;操作人员,c++,algorithm,sorting,c++11,stl,C++,Algorithm,Sorting,C++11,Stl,我正在写一个类来测试不同排序算法的效率(对于大学课程),我应该测试的算法中有一个是STL排序。为了度量效率,我们定义了一个类Integer,该类保存整数和整数值,还允许我们在每次比较或赋值时递增一个全局变量。然后,我有一个驱动程序类,它测试对多个整数向量的std::sort调用。我重载了',未分配向量[I]的值。因此,访问超出范围的向量值(例如one[9999999])会导致未定义的行为 用于std::vector分配和分配向量值: for(int i=0; i<10000; i++){

我正在写一个类来测试不同排序算法的效率(对于大学课程),我应该测试的算法中有一个是STL排序。为了度量效率,我们定义了一个类Integer,该类保存整数和整数值,还允许我们在每次比较或赋值时递增一个全局变量。然后,我有一个驱动程序类,它测试对多个整数向量的std::sort调用。我重载了',未分配向量[I]的值。因此,访问超出范围的向量值(例如
one[9999999]
)会导致未定义的行为

用于
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)));
}

for(int i=0;i您没有在vector中推送/追加元素。如果不分配空间或向后推送,您就不能以这种方式在vector中添加元素(我的clang编译器会由于错误的分配/数组超出边界而产生运行时错误)。请改用
push_

快速测试-

std::vector<Integer> arr{Integer(1), Integer(4), Integer(3)};
sort(arr.begin(), arr.end());

// now print Integer_count
向量arr{Integer(1),Integer(4),Integer(3)}; 排序(arr.begin(),arr.end()); //现在打印整数\ u计数
std::vector::operator[]
从不将新元素插入容器,也不会执行边界检查()。如果访问超出边界的元素,则会导致未定义的行为,这就是您的情况

您必须使用
std::vector::emplace_back
std::vector::push_back
,其他选项是使用构造函数
显式向量(size_type count);
来构造包含
count
默认插入实例的容器:

第一种选择:

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::向量一;
一、准备金(万元);
std::向量二;
二、准备金(万元);
std::向量三;
三、准备金(万元);
std::向量4;
四、准备金(万元);
std::载体五;
五、准备金(万元);
对于(int i=0;i<10000;++i){
一.安置(i);;
二.安置(10000-i);;
三、回位(rand()%(10000+1));
四、回位(rand()%(10000+1));
五、回位(兰特()%(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::向量一(10000);
std::向量二(10000);
std::向量三(10000);
std::矢量四(10000);
std::载体五(10000);
对于(int i=0;i<10000;++i){
一[i]=整数(i);
二[i]=整数(10000-i);
三[i]=整数(rand()%(10000+1));
四[i]=整数(rand()%(10000+1));
五[i]=整数(rand()%(10000+1));
}

std::sort(one.begin(),one.end())
必须工作。

您没有为std::vectors分配任何空间。
one[i]
不创建新元素。使用
one.push_back(整数(i));
vector[]不插入新元素-使用push_back而不是保留向量空间写入
std::vector one(10000)
例如。备选方案:
one.reserve(10000)
和in-the-the-loop
one.push_-back(Integer(i))
而不是赋值。打字,快速回答。谢谢@4386427非常感谢-试图快速将其拼凑在一起,却忘记了最简单的语法。我的错:)
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));
}