Сортировка вектора пользовательских объектов

У меня была та же проблема 27 сентября 2019.

Мой API находится в Предназначении ядра сети Dot к платформе .NET. edmx находится в другой библиотеке классов, которая находится в платформе .NET только.

я заметил это, когда я пытаюсь назвать это edmx от API.. по некоторым причинам я получил ту ошибку.

то, Что я сделал, перейдите к obj папке API и удалите все. тогда уберите проект API и попробуйте еще раз, и это работало на меня.

230
задан Ankur 4 September 2009 в 06:05
поделиться

5 ответов

Простой пример с использованием std :: sort

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};

struct less_than_key
{
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
    {
        return (struct1.key < struct2.key);
    }
};

std::vector < MyStruct > vec;

vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));

std::sort(vec.begin(), vec.end(), less_than_key());

Редактировать: Как указал Кирилл В. Лядвинский, вместо предоставления предиката сортировки вы можете реализовать оператор < для MyStruct :

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator < (const MyStruct& str) const
    {
        return (key < str.key);
    }
};

Использование этого метода означает, что вы можете просто отсортировать вектор следующим образом:

std::sort(vec.begin(), vec.end());

Edit2: Как предлагает Каппа, вы также можете отсортировать вектор в порядке убывания, перегрузив оператор > и немного изменив вызов сортировки:

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator > (const MyStruct& str) const
    {
        return (key > str.key);
    }
};

И вы должны вызвать сортировать как:

std::sort(vec.begin(), vec.end(),greater<MyStruct>());
340
ответ дан 23 November 2019 в 03:41
поделиться

Функтор можно использовать как третий аргумент std :: sort , или вы можете определить operator < в своем классе.

struct X {
    int x;
    bool operator<( const X& val ) const { 
        return x < val.x; 
    }
};

struct Xgreater
{
    bool operator()( const X& lx, const X& rx ) const {
        return lx.x < rx.x;
    }
};

int main () {
    std::vector<X> my_vec;

    // use X::operator< by default
    std::sort( my_vec.begin(), my_vec.end() );

    // use functor
    std::sort( my_vec.begin(), my_vec.end(), Xgreater() );
}
53
ответ дан 23 November 2019 в 03:41
поделиться

Вы на правильном пути. std :: sort будет использовать operator < в качестве функции сравнения по умолчанию. Итак, чтобы отсортировать ваши объекты, вам придется либо перегрузить bool operator <(const T &, const T &) , либо предоставить функтор, который выполняет сравнение, примерно так:

 struct C {
    int i;
    static bool before( const C& c1, const C& c2 ) { return c1.i < c2.i; }
 };

 bool operator<( const C& c1, const C& c2 ) { return c1.i > c2.i; }

 std::vector<C> values;

 std::sort( values.begin(), values.end() ); // uses operator<
 std::sort( values.begin(), values.end(), C::before );

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

13
ответ дан 23 November 2019 в 03:41
поделиться

Да, std :: sort () с третьим параметром (функцией или объектом) было бы проще. Пример: http://www.cplusplus.com/reference/algorithm/sort/

4
ответ дан 23 November 2019 в 03:41
поделиться

В своем классе вы можете перегрузить оператор «<».

class MyClass
{
  bool operator <(const MyClass& rhs)
  {
    return this->key < rhs.key;
  }
}
3
ответ дан 23 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: