Ошибки сегментации и ошибочный вывод из std :: sort - PullRequest
0 голосов
/ 28 марта 2020

Что-то не так в следующем коде, но я не могу понять, что это такое.

#include <map>
#include <iostream>
#include <random>
#include <algorithm>

class A
{
        public:

        A(int v) : val(v) { }
        A() = delete;

        const size_t val;

};

typedef std::shared_ptr<A> A_ptr;

class B
{
        public:
                B(unsigned int L)
                {
                        std::mt19937 rand_engine(9341255);
                        std::uniform_int_distribution<int> dist(1,1000);
                        for (int i = 0; i < L; ++i)
                        {
                                m.insert(std::pair<unsigned int, A_ptr>(i, std::make_shared<A>(dist(rand_engine))));
                        }

                }
                B() = delete;

                std::map<unsigned int, A_ptr> m;
};

int main()
{
        unsigned int b_size = 47;
        B b(b_size);

        std::vector<A_ptr> v = {};
        for (std::map<unsigned int, A_ptr>::iterator it = b.m.begin(); it != b.m.end(); ++it)
        {
                v.push_back(it->second);
        }

        std::cout << "v = ";
        for (auto & i : v)
                std::cout << i->val << " ";
        std::cout << "\n";

        std::sort(v.begin(), v.end(), [](A_ptr a1, A_ptr a2){ return (a1->val >= a2->val); });

        std::cout << "v sorted = ";
        for (auto & i : v)
                std::cout << i->val << " ";
        std::cout << "\n";

        return 0;
}

Этот код компилируется и выполняется и выдает следующий вывод:

g++ -std=c++17 map_sort.cpp -o map_sort && ./map_sort 
v = 634 739 51 906 227 185 738 302 310 888 886 644 191 719 68 212 124 732 879 724 671 167 367 313 813 1000 905 24 245 320 580 605 641 760 23 382 348 718 373 937 733 335 306 679 840 880 138 
v sorted = 1000 937 906 905 880 888 886 245 879 840 813 760 733 719 718 644 641 739 738 732 724 679 634 671 605 580 382 373 367 320 348 335 313 310 306 302 227 68 191 185 167 212 138 124 51 24 23

Обратите внимание, что вывод в строке v sorted NOT правильно отсортирован .

Изменение unsigned int b_size = 47 на unsigned int b_size = 48 приводит к следующему выводу:

g++ -std=c++17 map_sort.cpp -o map_sort && ./map_sort 
v = 634 739 51 906 227 185 738 302 310 888 886 644 191 719 68 212 124 732 879 724 671 167 367 313 813 1000 905 24 245 320 580 605 641 760 23 382 348 718 373 937 733 335 306 679 840 880 138 924 
Segmentation fault: 11

Аналогичное поведение наблюдается и для других значений b_size. Меня не удивит, если они исходят из одной и той же основной проблемы. Я явно неправильно использую std::sort, но понятия не имею, как. Кто-нибудь может пролить свет на это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...