Есть ли разница между этими компиляторами? - PullRequest
0 голосов
/ 02 июля 2019

Я запускаю один и тот же код в разных средах.

Первый - IDE (visual studio 2017). Второй - это gcc 4.8.5, предоставляемый веб-компилятором.

Но я получил другие результаты!

Вот пример кода, который я запускаю.

#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 .....

1 Ответ

3 голосов
/ 02 июля 2019

В стандартной библиотеке C ++ есть и std :: stable_sort , и std :: sort , и по уважительной причине.Если бы оба были одинаковыми, был бы стандартизирован только один.

Если вы хотите стабильную сортировку , используйте std::stable_sort.Если вы хотите быструю сортировку, просто используйте std::sort и оставьте больше свободы для вашей реализации.Не ожидайте, что разные компиляторы дадут один и тот же результат, когда стандарт C ++ предоставляет им некоторую свободу.

Имейте в виду, что язык программирования спецификация ,написано на английском.Потратьте больше времени на чтение вашего любимого стандарта C ++, такого как n3337 для C ++ 11 .Помните о неопределенном поведении и о гораздо более опасном неопределенном поведении .

Вторым является gcc 4.8.5

Помните, что GCC 4.8 является устаревшим неподдерживаемым компилятором .Текущая версия GCC, с мая 2019 года, GCC 9 .Я настоятельно рекомендую использовать недавний компилятор GCC (по крайней мере GCC 8 летом 2019 года).

...