Как изменить поведение парных (› и ‹) операторов?

Я пытаюсь отсортировать vector< pair<int,char> >, но я хочу изменить поведение операторов сравнения типа пары, чтобы, если первые значения равны и это сравнение с оператором (>), я хочу, чтобы он сравнивал второе значение с оператором (‹).

Я пытаюсь сделать это, чтобы решить вопрос "что такое криптоанализ. ?" проблема на уве. Вот мой подход:

string toLower(string in){
    string out;
    for(int i=0;i<in.length();i++){
        if(in.at(i)<='Z' && in.at(i)>='A'){
            out+=in.at(i)+('a'-'A');
        }
        else if(in.at(i)<='z' && in.at(i)>='a'){
            out+=in.at(i);
        }
    }
    return out;
}


int main(){
    //freopen("in.txt","r",stdin);
    //freopen("tmp.txt","w",stdout);
    vector< pair<int,char> >vp;
    pair<int,char> tp;

    for(char a='a';a<='z';a++){//buliding a table of values and chars
        tp= make_pair(0,a);
        vp.push_back(tp);
    }
    int T;
    cin >> T;
    string s;
    cin.ignore();
    for(int i=0;i<T;i++){
        getline(cin,s);
        s=toLower(s);//remove special chars and convert all to lower
        int l=s.length();
        for(int j=0;j<l;j++){
            vp[s[j]-'a'].first+=1;//increasing the value of each char found
        }
    }
    sort(vp.begin(),vp.end());//ascending sort
    for(int j=25;j>=0;j--){
        cout << (char)(vp[j].second -('a'-'A')) << " " <<vp[j].first << endl;//cout the Capital char and its value backwards (Descending)
    }
    //system("pause");
    return 0;
}

Но вот как выглядит вывод:

S 7
T 6
I 5
E 4
O 3
W 2
U 2
N 2
H 2
A 2
Y 1
Q 1
M 1
C 1
Z 0
X 0
V 0
R 0
P 0
L 0
K 0
J 0
G 0
F 0
D 0
B 0

так, например, я хочу, чтобы W U N H A было A H N U W

я читал о перегрузке в других вопросах, но я не знаю, как это реализовать здесь


person Ali Essam    schedule 05.02.2013    source источник
comment
вы не должны перегружать оператор здесь. Вы должны реализовать пользовательскую функцию сравнения и передать ее в std::find или просто перевернуть вектор после сортировки.   -  person stefan    schedule 05.02.2013


Ответы (3)


Просто предоставьте свою собственную функцию сравнения:

bool comp(const std::pair<int, char>& a, const std::pair<int, char>& b)
{
  if (a.first > b.first) {
    return true;
  } else if (a.first == b.first && a.second < b.second) {
    return true;
  }
  return false;
}

Затем используйте его при сортировке:

sort(vp.begin(),vp.end(), comp);
person Joseph Mansfield    schedule 05.02.2013

Это делается путем передачи пользовательской функции сравнения в sort. Вы можете легко сделать это с помощью лямбда, как это:

sort(
    vp.begin(),
    vp.end(),
    [](const pair<int,char>& lhs, const pair<int,char>& rhs) -> bool {
        return lhs.first != rhs.first 
            ? lhs.first < rhs.first 
            : lhs.second < rhs.second;
    }
);

Этот код сортирует по возрастанию first, а затем по возрастанию second, но вы можете настроить приоритет и направление двух сравнений, чтобы сортировать по своему усмотрению.

person Jon    schedule 05.02.2013
comment
Я думаю, что lhs.first < rhs.first должно быть lhs.first > rhs.first - спрашивающий хочет отсортировать по убыванию по первому элементу в паре. - person Joseph Mansfield; 05.02.2013
comment
@sftrabbit: не пытался определить точный вид; довольно легко увидеть, как его можно изменить. Однако добавил уточнение, спасибо. - person Jon; 05.02.2013
comment
спасибо за ваш ответ, я знаю, что ваш код теоретически должен работать быстрее из-за использования простого оператора if, но я выбрал код @sftrabbit, потому что он более удобочитаем для всех, еще раз спасибо :). - person Ali Essam; 05.02.2013

Я пытаюсь отсортировать векторную пару>, но я хочу изменить поведение сравнения

Просто определите подходящую функцию бинарного предиката и передайте ее в качестве третьего аргумента std::sort. Имейте в виду, что он должен реализовать строгий слабый порядок:

bool foo(const pair<int,char>& lhs, const pair<int,char>& rhs)
{
  // implement logic here
}

....

sort(vp.begin(),vp.end(), foo);
person juanchopanza    schedule 05.02.2013