std :: sort без функторов - PullRequest
       9

std :: sort без функторов

0 голосов
/ 01 июня 2009

У меня вопрос по поводу алгоритма std :: sort. Вот мой тестовый код:

struct MyTest
{
    int m_first;
    int m_second;

    MyTest(int first = 0, int second = 0) : m_first(first), m_second(second)
    {
    }
};


int main(int argc,char *argv[])
{
    std::vector<MyTest> myVec;
    for(int i = 0; i < 10; ++i)
    {
        myVec.push_back(MyTest(i, i + 1));
    }


    //Sort the vector in descending order on m_first without using stand alone function or functors


    return 0;

}  

Можно ли отсортировать вектор по переменной m_first без использования каких-либо отдельных функций или функторов? Также обратите внимание, что я не использую буст.

Ответы [ 6 ]

10 голосов
/ 01 июня 2009

Да, если тип значения в диапазоне, который должен быть отсортирован, имеет operator <, который определяет «строгий слабый порядок», то есть его можно использовать для правильного сравнения двух MyTest экземпляров. Вы можете сделать что-то вроде:

class MyTest
{
  ...
  bool operator <(const MyTest &rhs) const
  {
    return m_first<rhs.m_first;
  }
};
3 голосов
/ 01 июня 2009

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

2 голосов
/ 01 июня 2009

Можно сделать это с помощью функции-члена, но автономная функция - это путь.

bool operator <(const MyTest &lhs, const MyTest &rhs)
{
    return lhs.m_first<rhs.m_first;
}

Почему ..

Скотт Мейерс: Как функции, не являющиеся членами, улучшают инкапсуляцию

Если вы пишете функцию, которая может быть реализован в качестве члена или как не-друг, не член, вы должны предпочитаю реализовывать его как нечлен функция. Это решение увеличивает инкапсуляция классов. Когда ты думаешь инкапсуляция, вы должны подумать функции, не являющиеся членами.

Удивлены? Читать дальше

2 голосов
/ 01 июня 2009

Определить оператора <</p>

struct MyTest
{
...
    bool operator<(const MyTest& a_test) const {
        return m_first < a_test.m_first;
    }
};
1 голос
/ 01 июня 2009

Вы должны определить operator< в MyTest, и это должно выглядеть так:

bool operator<(const MyTest &other) const {
  return m_first < other.m_first;
};
0 голосов
/ 28 августа 2011

http://ideone.com/3QLtP

Это не определяет оператора <, но определяет функтор. </p>

Однако интересно путешествовать во времени или в процессе компиляции.

...