C++11. Есть multiset. Можно ли предать ему функцию, по которой буде сортировка? Например...

0 голосов
192 просмотров

C++11. Есть multiset. Можно ли предать ему функцию, по которой буде сортировка? Например multiset, сортирующий строки по возрастанию количества символов в строке.


Информатика (159 баллов) | 192 просмотров
0

Могу больше баллов дать, если слишком мало.

Дано ответов: 2
0 голосов
Правильный ответ

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

Ссылка на документацию:
(Удаленная ссылка на документацию на сайте cplusplus com, в поиске наберите multiset, вам необходима документация про конструктор данного класа)

(Для модераторов: прочитайте приложение после ответа, размещение ссылки в ответе не противоречит правилам сообщества)


Простенькая программа, как пример использования multiset и его сортировки строк по возрастанию.
Also, для сортировки в multiset, необходимо просто создать функциональный объект (структуру с перегруженным оператором () ) и добавить её в шаблонный конструктор.
Спасибо за отметку "Лучший ответ" и нажатую кнопочку "Спасибо" тут и в моем аккаунте.

#include
#include
#include

struct compareStructure
{
  bool operator() (const std::string& firstValue, const std::string& secondValue) const
  {
    return ( firstValue.size() < secondValue.size() );
  }
};

int main()
{
  std::multiset multisetExample;
 
  multisetExample.insert("verylongSomeString");
  multisetExample.insert("someString");
  multisetExample.insert("longSomeString");
 
  for (const auto& el : multisetExample)
  {
    std::cout << el << std::endl;<br>  }
 
  return 0;
}


Приложение для модераторов:
Ссылка не нарушает правил сообщества в соответствии с параграфом "§3. Услуги Сервиса", пунктом "Предоставление ответа на вопрос".

Цитата:
Размещённый в Сервисе ответ должен содержать решение всех проблем, содержащихся в вопросе.
Ответом на вопрос не может быть размещенная в Сервисе ссылка на другой интернет-источник, как и копия ответа, ранее размещённого в Сервисе другим Пользователем.
Ответ на вопрос из области точных предметов, требующий проведения соответствующих расчётов, не может состоять только из конечного результата, а должен содержать также упомянутые выше расчёты. Ответ должен содержать объяснение проблемы, указанной Пользователем таким образом, чтобы он мог понять, как следует решать данную проблему.

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

! Важно !
В частности прошу заметить что в соответствии с параграфом "§9. Политика конфиденциальности и контент третьих лиц", администрация сайта не запрещает размещать ссылки на Контент Третьих Лиц,  ровно, как и не несет ответственности за данный контент.

В связи с вышеизложенным, прошу не удалять ссылку на сторонний ресурс.

(1.4k баллов)
0

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

0

Спамите*

0

Вау, спасибо

0

Пожертвовать ради меня баном...

0

Каким баном?)

0

Я уважаю правила сообщества, по этому надеюсь что бан я не получу)
Если у вас есть вопросы по поводу решения, you're welcome!
Пожалуйста, давайте по делу, если есть вопросы по поводу бана/небана, пишите в лс или мне на стену, не хочу что бы тут были коменты не по теме, спасибо)

0

Ну я как житель цивилизованного мира руководствуюсь принципом: все легально что не запрещено законом, в общих правилах этого не нашел)

0 голосов

Желательно для начала самому понять, что должна делать ваша программа, разобраться с STL и почитать документацию, благо msdn бесплатен) Незнаю верно ли понял, но как вариант:
//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

#include
#include
#include

using namespace std;

template
class MyMultiset
{
public:
    void InsertElement(const string& str)
    {
        m.insert(str);
    }
    void PrintSorted(void(*SortMultiset)(multiset))
    {
        SortMultiset(m);
    }
private:
    multiset m;
};

template
void SortMultiset(multiset m)
{
    auto it     =  m.begin();
    auto comp   =  m.value_comp();
    do 
    {
        cout << " " << *it << endl;<br>    } 
    while (
            comp(*it++, *m.rbegin())
          );
}

int main()
{
    MyMultiset m;
    m.InsertElement("hi world");
    m.InsertElement("simple text");
    m.InsertElement("etc");
    m.PrintSorted(SortMultiset);
}

(4.2k баллов)
0

Компилятор отработает одинаково что так: for (...; i++) что так for (...; ++i), но как вам известно пишут преимущественно последнее, хоть это и не влияет по большей части на производительность.

0

Не знаю, что вы полагаете под "что там ещё", но C++ на данный момент используется как объектно ориентированный язык, но никак не как процедурный, на их же место приходят скриптовые языки, как Python, которые кстати тоже содержат в себе поддержку ООП. Вопрос не "умения" или "неумения" работы с компилятором.

0

Я просто не хочу, что бы подобные ошибки в ответах насаждали невежество в умах учащихся, если у вас есть аргументы, будьте любезны - испльзуйте их, иначе прошу вас воздержаться в подобных ответах на вопросы, так как они содержат ошибки.

0

Это место где люди ищут решения, а не площадка для социальных экспериментов. Как я писал выше, будьте любезны предоставить аргументы, в программировании никто никому не верит, все починается четким законам. ООП имеет непосредственное отношение к данному вопросу, более того ещё более прямое отношение к вашему ответу, извольте изъясниться, что значит "поломанное", а код писать можно и ручкой в конспекте (:

0

Почитайте о том кто такой Алан Кей и о том каким он видел ООП

0

К тому же, хочу уточнить вы сказали:
"если человек не может переделать кусочек кода под себя, вероятно ему не стоит продолжать"
Не хотите ли вы сказать этим, что ваше решение ЗАВЕДОМО НЕВЕРНОЕ и вы СОЗНАТЕЛЬНО ВВОДИТЕ В ЗАБЛУЖДЕНИЕ человека задавшего вопрос, к тому же вы утверждаете тут, что ваше решение не является ответом на поставленный вопрос??

0

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

0

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

0

Ууу как же вы ограничены) В том то и соль С++, хочу и пишу хоть функционально, какие проблемы? Мой пример показывает как можно делать, делать или нет решать ТС, если человек не может переделать кусочек кода под себя, вероятно ему не стоит продолжать, а брать готовое, ума не требует..

0

Он довольно известная личность и много чего говорил об ООП, будьте любезны предметно изъяснится.