我在不同的环境中运行相同的代码。
第一个是IDE(Visual Studio 2017)。 第二个是gcc 4.8.5提供的webcompiler。
但是,我得到了不同的结果!
这是我运行的示例代码。
#include<iostream>
#include<vector>
#include<algorithm>
class Data
{
public:
int num1;
int num2;
Data(int _num1, int _num2)
{
num1 = _num1;
num2 = _num2;
}
bool operator<(const Data &input) const
{
if (this->num1 < input.num1)return true;
else return false;
}
};
int main()
{
std::vector<Data> vec;
vec.push_back(Data(5, 3));
vec.push_back(Data(6, 0));
vec.push_back(Data(6, 1));
vec.push_back(Data(6, 2));
vec.push_back(Data(6, 4));
vec.push_back(Data(9, 5));
vec.push_back(Data(12, 6));
vec.push_back(Data(14, 7));
vec.push_back(Data(16, 8));
vec.push_back(Data(16, 10));
vec.push_back(Data(18, 9));
vec.push_back(Data(20, 11));
vec.push_back(Data(20, 12));
vec.push_back(Data(21, 14));
vec.push_back(Data(22, 13));
vec.push_back(Data(24, 15));
vec.push_back(Data(25, 18));
vec.push_back(Data(26, 16));
vec.push_back(Data(25, 17));
vec.push_back(Data(28, 19));
vec.push_back(Data(30, 20));
vec.push_back(Data(29, 21));
vec.push_back(Data(31, 23));
vec.push_back(Data(32, 22));
vec.push_back(Data(34, 24));
vec.push_back(Data(34, 26));
vec.push_back(Data(36, 25));
vec.push_back(Data(36, 27));
vec.push_back(Data(38, 28));
vec.push_back(Data(38, 30));
vec.push_back(Data(40, 29));
vec.push_back(Data(41, 32));
vec.push_back(Data(42, 31));
vec.push_back(Data(42, 34));
vec.push_back(Data(44, 33));
vec.push_back(Data(46, 35));
std::sort(vec.begin(), vec.end());
}
当我尝试打印vec元素时, 使用IDE时,我得到的结果如下。
5 3
6 0
6 1
6 2
6 4
9 5
12 6
.....
但是使用gcc时,我得到的结果不足。
5 3
6 0
6 4
6 2
6 1
9 5
12 6
.....
答案 0 :(得分:3)
标准C ++库中同时存在std::stable_sort和std::sort ,这是有充分理由的。如果两者相同,那么只有一个会被标准化。
如果您想要stable sort,请使用std::stable_sort
。如果您想进行快速排序,请仅使用std::sort
并为实现留出更多自由。当C ++标准允许它们具有一定的自由度时,不要指望不同的编译器会给出完全相同的结果。
请注意,编程语言是规范 ,是用英语编写的。花更多时间阅读您喜欢的C ++标准,例如n3337代表C++11。注意unspecified behavior和危险得多的undefined behavior。
第二个是gcc 4.8.5
请注意, GCC 4.8是一个过时的不受支持的编译器。自2019年5月起,当前的GCC版本为GCC 9。我强烈建议使用最新的GCC编译器(至少在GCC 8于2019年夏季)。