Вопрос задан 30.07.2023 в 21:01. Предмет Информатика. Спрашивает Олефир Слава.

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

сортирующий строки по возрастанию количества символов в строке.
0 0
Перейти к ответам

Ответы на вопрос

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Ларькова Алина.
Пожалуйста, открывайте документацию прежде чем задавать вопросы тут.
Вы порождаете спам, который решается запросом в поисковике.

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

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


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

#include <set>
#include <string>
#include <iostream>

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

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


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

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

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

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

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

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

#include <iostream>
#include <set>
#include <string>

using namespace std;

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

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

int main()
{
    MyMultiset<string> m;
    m.InsertElement("hi world");
    m.InsertElement("simple text");
    m.InsertElement("etc");
    m.PrintSorted(SortMultiset);
}
0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Да, в C++11 и более поздних версиях есть возможность передавать пользовательскую функцию или функциональный объект для определения сортировки в контейнер multiset (мультимножестве).

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

Вот пример, который иллюстрирует, как это сделать:

cpp
#include <iostream> #include <string> #include <set> // Функция сравнения для сортировки строк по возрастанию количества символов struct CompareByLength { bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs.size() < rhs.size(); } }; int main() { // Используем пользовательский компаратор для сортировки std::multiset<std::string, CompareByLength> myMultiset; myMultiset.insert("apple"); myMultiset.insert("orange"); myMultiset.insert("banana"); myMultiset.insert("grapes"); // Выводим элементы в порядке, определенном пользовательским компаратором for (const auto& element : myMultiset) { std::cout << element << " "; } return 0; }

В данном примере мы определили структуру CompareByLength, которая перегружает оператор (), чтобы сравнивать строки по длине (количеству символов). Затем мы передаем этот компаратор в мультимножество myMultiset.

Когда мы выводим элементы, они будут отсортированы по возрастанию длины строк:

grapes apple orange banana

Пожалуйста, обратите внимание, что мультимножество будет содержать все строки с одинаковой длиной в том порядке, в котором они были добавлены, потому что у него допускаются повторяющиеся элементы. Если вы хотите, чтобы строки с одинаковой длиной также сортировались в лексикографическом порядке, вы можете в компараторе использовать lhs < rhs для сравнения строк.

0 0

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

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос