C ++ Вектор сортировки структур с константными переменными по алфавиту - PullRequest
0 голосов
/ 11 апреля 2020

Здравствуйте, я хотел знать, возможно ли сделать что-то подобное? // СПАСИБО ! :)

struct PET
{ 
 const char* pet;
 const int age;
};

bool Sort(const PET& first, const PET& second)
{
    return first.pet < second.pet;
}

void  Foo(const std::vector<PET> pets)
{ 
  std::sort(pets.begin(), pets.end(), Sort); /* Does not work */
  
  std::cout << pets[0].pet;
  std::cout << pets[0].age;
  
}

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

Я полностью согласен с @ Ulrich Eckhardt.

Вы не можете отсортировать вектор так, как элементы вашего вектора нельзя назначить.

Я думаю, вы, возможно, запутались с использованием const.

Нет необходимости делать структурные переменные const. Параметр пользовательской функции сортировки обычно хранится как const, поскольку он не должен изменяться. Это шаблон, который обеспечивает безопасную практику кодирования.

Кроме того, если вы используете C ++, я бы предложил использовать std :: string вместо char *, так как std :: string является более чистым, более безопасный способ go, поскольку он снимает с программиста бремя управления памятью.

Посмотрите на работающую реализацию без использования const:

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

struct PET
{ 
    std::string name;
    int age;
};

bool compare(const struct PET& a, const struct PET& b){

    return (a.name.compare(b.name) <= 0) ? true : false;        
}

int main(){

    std::vector<struct PET> vec(3);

    vec[0].name = "dog";
    vec[0].age = 3;

    vec[1].name = "cat";
    vec[1].age = 1;

    vec[2].name = "bird";
    vec[2].age = 2;

    sort(vec.begin(), vec.end(), compare);

    for(int i=0;i<3;i++){

        std::cout<<vec[i].name<<" "<<vec[i].age<<std::endl;
    }
    return 0;

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

Как сказали @Deepak Tatyaji Ahire и @Ulrich Eckhardt, вы не можете делать то, что написали в своем коде.

const int не может быть переменной. Это константа для определения:)

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

#include<iostream>
#include<vector>

struct PET
{
 const char* pet;
 int age;

 PET(const char* c, int a) : pet(c) , age(a) {}

};

void  Foo(PET &p, std::vector<PET> &v)
{
  v.push_back(p);
  /*do something here if needed*/

}

int main()
{
    std::vector<PET> vect;
    PET cat("Cat", 5);
    PET dog("Dog", 10);
    PET bird("Bird", 2);
    Foo(cat, vect);
    Foo(dog, vect);
    Foo(bird, vect);
    /*this is not elegant, you could define a function that give a list of
    ({Animal, age},...) to vector and then pushes back all these elements to the vector*/
    for(int i=0; i<3; i++) std::cout<< vect[i].pet << ' ' << vect[i].age << std::endl; //std::cout << vect; if you are using an operator << overload
    /*to overload the << operator in order to able to print the vector of struct PET:

std::ostream & operator << (std::ostream &os, std::vector<PET> &p)
{
     os << "<";
    for (int i = 0; i < p.size(); i++) {
        os << p[i].pet;
        os << ", ";
        os << p[i].age;
        if (i != p.size() - 1)
            os << " - ";
    }
    os << ">\n";
    return os;
}

    */

    return 1;
}
0 голосов
/ 11 апреля 2020

AFAIK, нет способа напрямую сравнивать структуры без определения их компаратора.

Несмотря на то, что в C ++ 20, это вводит трехстороннее сравнение, и вам может быть разрешено объявить Сравнения по умолчанию одной строкой. Очень удобно. К сожалению, не было компилятора, реализующего эту функцию.

На данный момент вы должны вручную определить компаратор

inline bool cmp(const PET &lhs, const PET &rhs)
{
    return std::strcmp(lhs.pet, rhs.pet)<0;
}

и передать его в std::sort

...