Набор сортировки по параметру члена класса при вставке с помощью Boost - PullRequest
0 голосов
/ 08 апреля 2020

Я только начал изучать основы Boost, и сейчас я занимаюсь следующим упражнением:

Создание программы с несколькими объектами животного типа с именами переменных члена, leg и имеет_хвост. Храните объекты в контейнере из Boost.PointerContainer. Сортируйте контейнер в порядке возрастания на основе ветвей и запишите все элементы в стандартный вывод.

Проблема связана с тем, что я не могу отсортировать контейнер ПОСЛЕ вставки, и я, вероятно, должен попробовать использовать только библиотеку PointerContainer.

Ниже приведен код, который я написал на основе одного из примеров, приведенных в руководстве

class Animal{
    private:
        std::string name;
        int legs;
        bool hasTail;
    public:
        Animal() = delete;
        Animal(char* aName, int nLegs = 0, bool sTail = false) : name(aName), legs(nLegs), hasTail(sTail) {};
        inline int getLegs(){ return legs; };
        friend std::ostream& operator<<(std::ostream& os, const Animal& animal);
};

std::ostream& operator<<(std::ostream& os, const Animal& animal)
{
  os << "Name: " << animal.name << " || Legs: " << animal.legs << " || Has a tail? " << animal.hasTail << std::endl;
  return os;
}

int main()
{
  Animal cat("Cat", 4, true), spider("Common Spider", 8, false), slug("Slug");
  std::set<std::unique_ptr<Animal>, boost::indirect_fun<std::less<int>>> v;
  v.insert(std::unique_ptr<Animal>(&cat));
  v.insert(std::unique_ptr<Animal>(&spider));
  v.insert(std::unique_ptr<Animal>(&slug));

  //print result

}

Конечно, я знаю причину, по которой это не так. не потому, что я пытаюсь использовать косвенный_фун с параметром int, но я передаю объект типа Animal в набор, просто чтобы дать вам представление о том, какие инструменты мне «разрешено» использовать для упражнение и какая у меня была общая идея.

1 Ответ

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

Вам нужно «сказать» std::less, как сравнивать ваши Animal объекты:

bool operator<(const Animal& a, const Animal& b) { return a.getLegs() < b.getLegs(); }

(а также сделать getLegs() const, чтобы это работало). Обновленный пример:

#include <boost/ptr_container/ptr_set.hpp>
#include <boost/ptr_container/indirect_fun.hpp>
#include <set>
#include <memory>
#include <functional>
#include <iostream>


class Animal{
    private:
        std::string name;
        int legs;
        bool hasTail;
    public:
        Animal() = delete;
        Animal(std::string aName, int nLegs = 0, bool sTail = false) : name(aName), legs(nLegs), hasTail(sTail) {};
        inline int getLegs() const{ return legs; };
        friend std::ostream& operator<<(std::ostream& os, const Animal& animal);
};

bool operator<(const Animal& a, const Animal& b) { return a.getLegs() < b.getLegs(); }

std::ostream& operator<<(std::ostream& os, const Animal& animal)
{
  os << "Name: " << animal.name << " || Legs: " << animal.legs << " || Has a tail? " << animal.hasTail << std::endl;
  return os;
}

int main()
{
  std::set<std::unique_ptr<Animal>, boost::indirect_fun<std::less<Animal>>> v;
  v.insert(std::unique_ptr<Animal>(new Animal("Cat", 4, true)));
  v.insert(std::unique_ptr<Animal>(new Animal("Common Spider", 8, false)));
  v.insert(std::unique_ptr<Animal>(new Animal("Slug")));

  for(const auto& animal: v)
  {
    std::cout << *animal << std::endl;   
  }
}
$ g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
Name: Slug || Legs: 0 || Has a tail? 0

Name: Cat || Legs: 4 || Has a tail? 1

Name: Common Spider || Legs: 8 || Has a tail? 0

http://coliru.stacked-crooked.com/a/8d8f635dc357404f

...