Как отсортировать вектор STL?

Для отслеживания добавьте два атрибута к вашей модели (created_by и updated_by), в «updated_by» сохраните последнего пользователя, который изменил запись. Затем в вашем сигнале у вас есть пользователь:

models.py:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    created_by = models. (max_length=100)
    updated_by = models. (max_length=100)

views.py

    p = Question.objects.get(pk=1)
    p.question_text = 'some new text'
    p.updated_by = request.user
    p.save()

signals.py

@receiver(pre_save, sender=Question)
def do_something(sender, instance, **kwargs):
    try:
        obj = Question.objects.get(pk=instance.pk)
    except sender.DoesNotExist:
        pass
    else:
        if not obj.user == instance.user: # Field has changed
            # do something
            print('change: user, old=%s new=%s' % (obj.user, instance.user))
73
задан Gal Dreiman 9 August 2017 в 06:28
поделиться

4 ответа

Перегрузка меньше, чем оператор, затем выполните сортировку. Это пример, который я нашел в Интернете ...

class MyData
{
public:
  int m_iData;
  string m_strSomeOtherData;
  bool operator<(const MyData &rhs) const { return m_iData < rhs.m_iData; }
};

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

Источник: здесь

77
ответ дан 24 November 2019 в 11:49
поделиться
std::sort(object.begin(), object.end(), pred());

где, pred () - это функциональный объект, определяющий порядок объектов myclass . В качестве альтернативы вы можете определить myclass :: operator <.

Например, вы можете передать лямбда:

std::sort(object.begin(), object.end(),
          [] (myclass const& a, myclass const& b) { return a.v < b.v; });

Или, если вы застряли в C ++ 03, подход объекта функции ( v - это член, по которому вы хотите выполнить сортировку):

struct pred {
    bool operator()(myclass const & a, myclass const & b) const {
        return a.v < b.v;
    }
};
113
ответ дан 24 November 2019 в 11:49
поделиться

Указатель на член позволяет написать один компаратор, который может работать с любым членом данных вашего класса:

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

template <typename T, typename U>
struct CompareByMember {
    // This is a pointer-to-member, it represents a member of class T
    // The data member has type U
    U T::*field;
    CompareByMember(U T::*f) : field(f) {}
    bool operator()(const T &lhs, const T &rhs) {
        return lhs.*field < rhs.*field;
    }
};

struct Test {
    int a;
    int b;
    std::string c;
    Test(int a, int b, std::string c) : a(a), b(b), c(c) {}
};

// for convenience, this just lets us print out a Test object
std::ostream &operator<<(std::ostream &o, const Test &t) {
    return o << t.c;
}

int main() {
    std::vector<Test> vec;
    vec.push_back(Test(1, 10, "y"));
    vec.push_back(Test(2, 9, "x"));

    // sort on the string field
    std::sort(vec.begin(), vec.end(), 
        CompareByMember<Test,std::string>(&Test::c));
    std::cout << "sorted by string field, c: ";
    std::cout << vec[0] << " " << vec[1] << "\n";

    // sort on the first integer field
    std::sort(vec.begin(), vec.end(), 
        CompareByMember<Test,int>(&Test::a));
    std::cout << "sorted by integer field, a: ";
    std::cout << vec[0] << " " << vec[1] << "\n";

    // sort on the second integer field
    std::sort(vec.begin(), vec.end(), 
        CompareByMember<Test,int>(&Test::b));
    std::cout << "sorted by integer field, b: ";
    std::cout << vec[0] << " " << vec[1] << "\n";
}

Output:

sorted by string field, c: x y
sorted by integer field, a: y x
sorted by integer field, b: x y
15
ответ дан 24 November 2019 в 11:49
поделиться

Как объяснялось в других ответах, вам нужно обеспечить функцию сравнения. Если вы хотите сохранить определение этой функции рядом с sort (например, если она имеет смысл только для этой сортировки), вы можете определить ее прямо здесь with boost::lambda. Используйте boost::lambda::bind для вызова функции-члена.

Для сортировки, например, по переменной-члену или функции data1:

#include <algorithm>
#include <vector>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
using boost::lambda::bind;
using boost::lambda::_1;
using boost::lambda::_2;

std::vector<myclass> object(10000);
std::sort(object.begin(), object.end(),
    bind(&myclass::data1, _1) < bind(&myclass::data1, _2));
9
ответ дан 24 November 2019 в 11:49
поделиться
Другие вопросы по тегам:

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