Сортировка записей в структуре

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Вывести список на экран, упорядочив фамилии авторов в алфавитном порядке.
сама структура:
− фамилия и инициалы автора (строка 15 символов);
− название книги (строка 20 символов);
− год издания (целое положительное четырехзначное число);
− количество страниц (целое положительное число).

Код: Выделить всё

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

struct Book
{
	std::string authorData;
	std::string bookName;
	
	size_t year;
	size_t pagesCount;
};

int main()
{
	size_t booksCount;
	std::cout << "N: ";
	std::cin >> booksCount;

	std::vector <Book *> booksVector;
	for (size_t i = 0; i < booksCount; i++) {
		std::cin.clear();
		std::cin.sync();

		Book *currentBook = new Book();
		std::cout << "Book #" << (i + 1) << ":" << std::endl;

		std::cout << "Author: ";
		std::getline(std::cin, currentBook->authorData);
		std::cin.clear();
		std::cin.sync();

		std::cout << "Book name: ";
		std::getline(std::cin, currentBook->bookName);
		std::cin.clear();
		std::cin.sync();

		std::cout << "Book year: ";
		std::cin >> currentBook->year;

		std::cout << "Pages count: ";
		std::cin >> currentBook->pagesCount;

		booksVector.push_back(currentBook);
		std::system("cls");
	}

	std::sort(booksVector.begin(), booksVector.end(), [](Book *leftBook, Book *rightBook) -> bool {
		return (leftBook->authorData < rightBook->authorData);
	});
	for (Book *currentBook : booksVector) {
		std::cout << "Author: " << currentBook->authorData << std::endl;
		std::cout << "Book name: " << currentBook->bookName << std::endl;
		std::cout << "Book year: " << currentBook->year << std::endl;
		std::cout << "Pages count: " << currentBook->pagesCount << std::endl;
		std::cout << std::endl;
	}

	std::system("pause");
	return 0;
}
Не понимаю как мне написать код сортировки полей, в приложенном коде сортировка написана на С++11 а мне надо на С++

Код: Выделить всё

std::sort(booksVector.begin(), booksVector.end(), [](Book *leftBook, Book *rightBook) -> bool {
		return (leftBook->authorData < rightBook->authorData);
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Вместо лямбда выражения следует использовать предикат.

Код: Выделить всё

struct CompareBook
{
   operator bool(Book *leftBook, Book *rightBook)
   {
      return (leftBook->authorData < rightBook->authorData);
   }
};

...

std::sort(booksVector.begin(), booksVector.end(), CompareBook());
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

а вместо чего или куда вот это строчку вставить?

Код: Выделить всё

struct CompareBook
{
   operator bool(Book *leftBook, Book *rightBook)
   {
      return (leftBook->authorData < rightBook->authorData);
   }
};

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Расположи объявление предиката, к примеру, в глобальной области видимости, после структуры Book.

Кстати, более правильно всё же будет объявить оператор "меньше". А ещё я бы const добавил, чтобы совсем красиво было:

Код: Выделить всё

struct CompareBook
{
   bool operator<(const Book *leftBook, const Book *rightBook)
   {
      return (leftBook->authorData < rightBook->authorData);
   }
};
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Ошибку выдает, я же так все сделал?

Код: Выделить всё

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

struct Book
{
	std::string authorData;
	std::string bookName;

	size_t year;
	size_t pagesCount;
};
 struct CompareBook
{
   bool operator<(const Book *leftBook, const Book *rightBook)
     {
      return (leftBook->authorData < rightBook->authorData);
      }
};
int main()
{
	size_t booksCount;
	std::cout << "N: ";
	std::cin >> booksCount;

	std::vector <Book *> booksVector;
	for (size_t i = 0; i < booksCount; i++) {
		std::cin.clear();
		std::cin.sync();

		Book *currentBook = new Book();
		std::cout << "Book #" << (i + 1) << ":" << std::endl;

		std::cout << "Author: ";
		std::getline(std::cin, currentBook->authorData);
		std::cin.clear();
		std::cin.sync();

		std::cout << "Book name: ";
		std::getline(std::cin, currentBook->bookName);
		std::cin.clear();
		std::cin.sync();

		std::cout << "Book year: ";
		std::cin >> currentBook->year;

		std::cout << "Pages count: ";
		std::cin >> currentBook->pagesCount;

		booksVector.push_back(currentBook);
		std::system("cls");
	}

std::sort(booksVector.begin(), booksVector.end(), CompareBook());
	for (Book *currentBook : booksVector) {
		std::cout << "Author: " << currentBook->authorData << std::endl;
		std::cout << "Book name: " << currentBook->bookName << std::endl;
		std::cout << "Book year: " << currentBook->year << std::endl;
		std::cout << "Pages count: " << currentBook->pagesCount << std::endl;
		std::cout << std::endl;
	}

	std::system("pause");
	return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Какая именно ошибка? Я не могу догадаться и у меня сейчас нет под рукой компилятора, чтобы проверить. Подозреваю, что она уже дальше в for, так как в С++ 99 нет поддержки итерирования на уровне языка.

Код: Выделить всё

    for (std::vector<Book*>::const_iterator itBook = booksVector.begin(); itBook != booksVector.end(); ++itBook)
    {
        const Book* currentBook = *itBook;
        std::cout << "Author: " << currentBook->authorData << std::endl;
        std::cout << "Book name: " << currentBook->bookName << std::endl;
        std::cout << "Book year: " << currentBook->year << std::endl;
        std::cout << "Pages count: " << currentBook->pagesCount << std::endl;
        std::cout << std::endl;
    }
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Нет, он ругается на структуру CompareBook
Build [C++ Error] Unit1.cpp(17): E2080 'CompareBook:: operator <(const Book *,const Book *)' must be declared with one parameter
[C++ Error] _algo.c(1052): E2314 Call of nonfunction
[C++ Error] _algo.c(726): E2314 Call of nonfunction
[C++ Error] _algo.c(729): E2314 Call of nonfunction
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да, всё-таки самый первый вариант правильнее:

Код: Выделить всё

struct CompareBook
{
   bool operator()(const Book *leftBook, const Book *rightBook)
   {
      return (leftBook->authorData < rightBook->authorData);
   }
};
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Так вот именно, тоже самое, ошибку выдает, такую же
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Добрался до компьютера со студией. У меня компилируется и работает:

Код: Выделить всё

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

struct Book
{
    std::string authorData;
    std::string bookName;

    size_t year;
    size_t pagesCount;
};

struct CompareBook
{
	bool operator()(const Book *leftBook, const Book *rightBook)
	{
		return (leftBook->authorData < rightBook->authorData);
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
    size_t booksCount;
    std::cout << "N: ";
    std::cin >> booksCount;

    std::vector <Book *> booksVector;
    for (size_t i = 0; i < booksCount; i++)
    {
        std::cin.clear();
        std::cin.sync();

        Book *currentBook = new Book();
        std::cout << "Book #" << (i + 1) << ":" << std::endl;

        std::cout << "Author: ";
        std::getline(std::cin, currentBook->authorData);
        std::cin.clear();
        std::cin.sync();

        std::cout << "Book name: ";
        std::getline(std::cin, currentBook->bookName);
        std::cin.clear();
        std::cin.sync();

        std::cout << "Book year: ";
        std::cin >> currentBook->year;

        std::cout << "Pages count: ";
        std::cin >> currentBook->pagesCount;

        booksVector.push_back(currentBook);
        std::system("cls");
    }

	std::sort(booksVector.begin(), booksVector.end(), CompareBook());

	for (std::vector<Book*>::const_iterator itBook = booksVector.begin(); 
		itBook != booksVector.end(); ++itBook)
    {
        const Book* currentBook = *itBook;
		std::cout << "Author: " << currentBook->authorData << std::endl;
        std::cout << "Book name: " << currentBook->bookName << std::endl;
        std::cout << "Book year: " << currentBook->year << std::endl;
        std::cout << "Pages count: " << currentBook->pagesCount << std::endl;
        std::cout << std::endl;
    }

    std::system("pause");
    return 0;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить