Работа с std::vector в С++

340
15 января 2018, 09:00

Задача состоит в следующем:

Дана последовательность чисел. Cледует упорядочить их по неубыванию последней цифры, а при равенстве последних цифр – по неубыванию самих чисел.

Пример:

Входные данные: 12 15 43 13 20 1 15

Выходные данные: 20 1 12 13 43 15 15

Код:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool mySort(int x, int y)
{
    if (x == y)
    {
        return x < y;
    }
    else return x % 10 < y % 10;
}
int main()
{
    vector<int> myVector;
    myVector.push_back(12);
    myVector.push_back(15);
    myVector.push_back(43);
    myVector.push_back(13);
    myVector.push_back(20);
    myVector.push_back(1);
    myVector.push_back(15);
    for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); it++)
        cout << *it << endl;
    cout << endl;
    sort(myVector.begin(), myVector.end(), mySort);
    for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); it++)
        cout << *it << endl;
    system("pause");
    return 0;
}

Выводится:

20 1 12 43 13 15 15

Возможно не совсем понял работу предиката, или где-то ошибка(используется однозначное число). Объясните поподробней работу предиката и все,что с этим связано,а также исправьте код.Спасибо.

Answer 1
bool mySort(int x, int y)
{
    if (x % 10 != y % 10) return (x % 10 < y % 10);
    return x < y;
}

Вам же сначала нужно проверить последнюю цифру, и только если они равны, сравнивать сами числа.

Вот рабочий код - https://ideone.com/EgDyWy

Предикат получает два значения из сортируемой коллекции и сравнивает их. Какие именно значения - это уже определяется алгоритмом, но предикат должен обеспечивать слабое упорядочение (кажется, так).

Ваш предикат принимает те же 43 и 13 как равные: поскольку они не равны, он сравнивает их последнюю цифру. А она одна и та же. В результате и на вопрос "43 меньше 13?", и на вопрос "13 меньше 43?" ответ один - нет. А значит, 13 и 43 с точки зрения вашего предиката - равны.

READ ALSO
Где тут логика? - c++

Где тут логика? - c++

Я не ошибся словом, именно логика

314
Не удаляется последняя строка в QTableWidget

Не удаляется последняя строка в QTableWidget

Есть кнопка delete при нажатии которой удаляется выделенная строкаЕсли в таблице больше одной строки, то проблем с удалением нету, однако когда...

293
Работа с Realm в ViewHolder

Работа с Realm в ViewHolder

Не могу реализовать функцию избраное в бд RealmОпыта с ORM ранее не имел поэтому прошу извенить за вопрос

248
org.apache.axis.wsdl.toJava.DuplicateFileException: Duplicate file name

org.apache.axis.wsdl.toJava.DuplicateFileException: Duplicate file name

Пытаюсь распарсить wsdl в RPC/Encoding стиле с помощью утилиты h WSDL2Java от Apache Axis 14

274