Ошибки в быстрой сортировке на C++

Рейтинг: -1Ответов: 1Опубликовано: 08.08.2023

Написал свой вариант быстрой сортировки на C++. Не могу понять как пофиксить ошибку "начальное значение ссылки на неконстантный параметр должно быть левосторонним значением" в 31 строчке + ошибки в конкатенации векторов. Бьюсь уже долго с этим

Мой код:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

vector <int> concatenate(vector <int>& vec_less, vector <int>& vec_pivot, vector <int>& vec_greater)
{
    vec_less.insert(vec_less.end(), vec_pivot.begin(), vec_pivot.end());
    vec_less.insert(vec_less.end(), vec_greater.begin(), vec_greater.end());
    return vec_less;
}

vector <int> quick_sort(vector <int>& vec)
{
    int vec_size = vec.size();
    vector <int> less;
    vector <int> greater;
    if (vec_size < 2)
        return vec;
    else
    {
        int pivot = vec[0];
        for (int i = 1; i < vec_size; ++i)
        {
            if (vec[i] < pivot)
                less.push_back(vec[i]);
            if (vec[i] >= pivot)
                greater.push_back(vec[i]);
        }
        vector <int> vec_piv = { pivot };
        vector <int> sorted_vec = concatenate(quick_sort(less), vec_piv, quick_sort(greater));
        return sorted_vec;
    }
}

vector <int> get_vector()
{
    vector <int> vec;
    string current_stroke;
    while (true)
    {
        cin >> current_stroke;
        if (current_stroke == "q")
            break;
        vec.push_back(stoi(current_stroke));
    }
    return vec;
}

int main()
{
    vector <int> vec = get_vector();
    cout << endl;
    int n = vec.size();
    for (auto i : vec)
        cout << i << "\t";
    cout << endl; 
    vector <int> sorted_vec = quick_sort(vec);
    for (auto i : sorted_vec)
        cout << i << "\t";
    return 0;
}

Ответы

▲ 3

Например, так:

    vector<int>  vec_middle_l = quick_sort(less);
    vector<int>  vec_middle_g = quick_sort(greater);
    vector <int> sorted_vec = concatenate(vec_middle_l, vec_piv, vec_middle_g);

Понимаете, вы получаете временный объект из quick_sort, а потом хотите работать с ним, как с полноценной переменной.

Можно еще и так:

vector <int> concatenate(vector <int> vec_less, vector <int>& vec_pivot, vector <int> vec_greater)

Компилируется. На семантические ошибки ваш код не проверял.

Только вот все это решения очень нехорошие. Хотя бы потому, что вы все время создаете новые и новые вектора. Вам надо не решать проблему "как заставить скомпилироваться", а "как написать правильно". И без изучения того, что такое ссылки и сопутствующих тем не обойтись...