Страница 1 из 2

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

Добавлено: 03 янв 2015, 22:16
vbn
Вывести список на экран, упорядочив фамилии авторов в алфавитном порядке.
сама структура:
− фамилия и инициалы автора (строка 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);

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

Добавлено: 03 янв 2015, 22:32
Romeo
Вместо лямбда выражения следует использовать предикат.

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

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

...

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

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

Добавлено: 03 янв 2015, 23:12
vbn
а вместо чего или куда вот это строчку вставить?

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

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


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

Добавлено: 03 янв 2015, 23:52
Romeo
Расположи объявление предиката, к примеру, в глобальной области видимости, после структуры Book.

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

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

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

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

Добавлено: 04 янв 2015, 12:06
vbn
Ошибку выдает, я же так все сделал?

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

#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;
}

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

Добавлено: 04 янв 2015, 15:53
Romeo
Какая именно ошибка? Я не могу догадаться и у меня сейчас нет под рукой компилятора, чтобы проверить. Подозреваю, что она уже дальше в 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;
    }

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

Добавлено: 04 янв 2015, 17:05
vbn
Нет, он ругается на структуру 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

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

Добавлено: 04 янв 2015, 17:19
Romeo
Да, всё-таки самый первый вариант правильнее:

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

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

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

Добавлено: 04 янв 2015, 17:43
vbn
Так вот именно, тоже самое, ошибку выдает, такую же

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

Добавлено: 04 янв 2015, 20:09
Romeo
Добрался до компьютера со студией. У меня компилируется и работает:

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

#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;
}