Сортировка строк в порядке возрастания по определенному значению. Что не так в моей реализации? - PullRequest
0 голосов
/ 09 апреля 2019

У меня следующая проблема:

Учитывая число N и N имен, сортируйте имена по определенному значению (в порядке возрастания). Имена с одинаковым значением сортируются в алфавитном порядке.

Значение каждого имени определяется количеством пар гласных или согласных. Таким образом, каждая пара гласных добавляет 1 к значению слова, каждая пара согласных вычитает 1 из значения, а пара гласных-согласных или согласных-гласных не меняет значение слова.

Что я сделал: Я создал вектор, используя структуру. Каждый элемент имеет имя и свое значение. Я рассчитал значение каждого имени и дал его в поле .value. После этого я отсортировал свой вектор, используя 2 для циклов (у меня не было эффективной идеи для сортировки значений и сортировки по алфавиту все в одном), и отобразил вектор.

Что происходит: Я не получаю результата, и я также думаю, что может быть ошибка сегментации. Я все еще новичок, когда дело доходит до обнаружения таких ошибок.

Можете ли вы дать мне несколько советов?

Спасибо.

Прикрепленный код ниже.

#include <vector>
#include <string>
#include <cstring>
using namespace std;
const char voc[] = "aeiouAEIOU";

struct stud
{
    string name;
    int value;
};

typedef vector<stud> vect;

void data(int& n, vect& v)
{
    cin>>n;
    for(int i = 0; i < n; ++i)
    {
        cin>>v[i].name;
    }
}

int getValue(string name)
{
    int value = 0;
    int len = name.length();
    for(int i = 0; i < len; ++i)
    {
        if(strchr(voc, name[i]) && strchr(voc, name[i+1]))
            value++;
        else if(!strchr(voc, name[i]) && !strchr(voc, name[i+1]))
            value--;
    }
    return value;
}

void updateValues(vect& v)
{
    vector<stud>::size_type v_size = v.size();
    for(unsigned i = 0; i < v_size; ++i)
    {
        int value = getValue(v[i].name);
        v[i].value = value;
    }
}

void sortByValue(vect& v)
{
    vector<stud>::size_type v_size = v.size();
    for(unsigned i = 0; i < v_size; ++i)
        for(unsigned j = i+1; j < v_size; ++j)
        {
            if(v[i].value > v[j].value)
                swap(v[i], v[j]);
            else if(v[i].value == v[j].value)
                if(v[i].name.compare(v[j].name) > 0)
                    swap(v[i], v[j]);
        }
}

void display(vect v)
{
    vector<stud>::size_type sz = v.size();
    for(unsigned i = 0; i < sz; ++i)
        cout<<v[i].name<<'\n';
}

int main()
{
    int n;
    vect myvec;

    data(n, myvec);
    updateValues(myvec);
    sortByValue(myvec);

    display(myvec);

    return 0;
}

1 Ответ

1 голос
/ 09 апреля 2019

лучше использовать оператор перегрузки> смотреть здесь или используйте std :: sort

std::vector<stud> vec;

//read

std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) -> bool
{ 
    if (a.value == b.value)
        return a.name > b.name;
    else
        return a.value > b.value

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