Как использовать данные, хранящиеся в карте, чтобы отсортировать массив с помощью функции std :: sort () в C ++? - PullRequest
0 голосов
/ 22 апреля 2020

Я хотел использовать карту ha sh для сортировки строки на основе значений, которые имеет карта. Но я просто не смог найти подходящий способ .. Пожалуйста, помогите мне найти способ. так вот код на C ++, который я написал, помогите мне, как написать его лучше. Я хочу знать, как использовать std :: sort (), передавая структуру данных для сортировки

#include<bits/stdc++.h>
using namespace std;
unordered_map<char,int>m;
bool h(char a,char b)
{
    return m[a]<=m[b];
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        //unordered_map<char,int>m;
        for(int i=1;i<=26;i++)
        {
            char a;
            cin>>a;
            m[a]=i;
        }
        string s;
        cin>>s;
        sort(s.begin(),s.end(),h);
        cout<<s<<endl;
        //m.erase(m.begin(),m.end());
        //cout<<endl<<m.size();
    }
}

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Ваша Сравнить функция не соответствует требованию строгого слабого порядка .

return m[a] <= m[b]; должно быть return m[a] < m[b];

С этим изменением , ваша программа работает правильно и сортирует std::string в порядке, в котором находится ваша карта. Если вы введете символы zyxwvutsrqponmlkjihgfedcba, ваш sort будет сортировать string в обратном алфавитном порядке.

Предложения:

  • Читайте о почему вы не должен включать <bits/stdc++.h>. Вместо этого включите правильные заголовки:

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <unordered_map>
    
  • Старайтесь избегать магических c чисел, таких как 26. Вы можете сделать свой l oop таким же образом для того же эффекта:

    for(int i = 0; i <= 'Z'-'A'; i++)
    

    1-26 и 0-25 (как указано выше l * 1056) * производит) будет иметь тот же эффект.

  • Избегайте глобальных переменных, таких как m. Вы можете сделать его локальным и ссылаться на него в функторе , как лямбда.

  • Чтение Почему using namespace std; считается плохой практикой?

0 голосов
/ 22 апреля 2020

Я собираюсь предположить, что рекомендованные строки были тем, что вы пытались заставить работать.

#include <unordered_map>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main()
{
    cout << "enter number of times" << endl;
    int t;
    cin>>t;
    while(t--)
    {
        unordered_map<char,int>m;
        cout << "enter 26 characters" << endl;
        for(int i=1;i<=26;i++)
        {
            char a;
            cin>>a;
            m[a]=i;
        }
        cout << "enter a string" << endl;
        string s;
        cin>>s;
        sort(s.begin(),s.end(), [&](char a, char b)
        {
            return m[a]<m[b];
        });
        cout<<s<<endl;
        m.erase(m.begin(),m.end());
        cout<<endl<<m.size();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...