c++ - 这些编译器之间有什么区别吗?

标签 c++ visual-studio sorting gcc

我在不同的环境中运行相同的代码。

第一个是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 .....

最佳答案

两者都有 std::stable_sortstd::sort在标准 C++ 库中,这是有充分理由的。如果两者相同,则只会标准化一个。

如果你想要一个stable sort ,使用 std::stable_sort。如果您想要快速排序,只需使用 std::sort 并为您的实现留出更多自由。当 C++ 标准允许它们有一定的自由度时,不要指望不同的编译器给出完全相同的结果。

请注意,编程语言是用英语编写的规范。花更多时间阅读您最喜欢的 C++ 标准,例如 n3337对于C++11 .注意这两个 unspecified behavior和更危险的undefined behavior .

Second one is gcc 4.8.5

请注意 GCC 4.8是一个过时的不受支持的编译器。 GCC 的当前版本是,自 2019 年 5 月起,GCC 9 .我强烈建议使用最新的 GCC 编译器(2019 年夏季至少 GCC 8)。

关于c++ - 这些编译器之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56852787/

相关文章:

c++ - 打开文件没有警告提示

vb.net - Visual Studio 2013 每次都进行不必要的构建并且速度很慢

Java冒泡排序算法计时器问题

c++ - Xcode 6 的 Playground 功能适用于 Visual Studio 或其他使用 C++ 的 IDE?

用于 .NET 的 Oracle 数据提供程序已在没有机器范围配置的情况下安装

linux - SORT - 如果某些列中有缺失值怎么办?

java - Collections.sort 不适用于 Java 1.7

c++ - 有if-else,有没有Neither Nor语句?

c++ - 通过 CRTP 使用派生类变量初始化基类静态常量变量

c++ - STL如何返回2个具有相同功能的迭代器?