0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
1

Три наибольших элемента в ассоциативном контейнере map

02.06.2020, 04:39. Показов 1709. Ответов 17

Author24 — интернет-сервис помощи студентам
Не могу понять как найти 3 наибольших элемента в ассоциативном контейнере map, по задаче мне нужно 3 максимальных числа в нем. Может кто сталкивался с этим, объясните пожалуйста))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2020, 04:39
Ответы с готовыми решениями:

Найти три наибольших элемента в массиве
Здравствуйте! Помогите, пожалуйста, с задачей: необходимо найти три наибольших элемента в массиве....

Найти три наибольших элемента массива.
1.Дан вектор А(n). Вычислить:максимальный элемент вектора; 2.Найти тpи наибольших элемента массива...

Найти три наибольших элемента массива
Ввести массив действительных чисел длиной n (n < 30). Найти три наибольших элемента массива.

Найти три наибольших элемента массива
дан массив действительных чисел K(M,A). найти три наибольших значения.

17
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
02.06.2020, 09:27 2
Если наибольшие по ключу, то
end()-1, end()-2, end()-3
будут указателями на эти 3 элемента

Если наибольшее по значению, то сначала перепишите в другую map моменяв местами значение и ключ.
0
Вездепух
Эксперт CЭксперт С++
11689 / 6368 / 1723
Регистрация: 18.10.2014
Сообщений: 16,051
02.06.2020, 09:53 3
Цитата Сообщение от neChelovek31 Посмотреть сообщение
Не могу понять как найти 3 наибольших элемента в ассоциативном контейнере map
Что такое "наибольший элемент в ассоциативном контейнере"? В ассоциативном контейнере хранятся пары.
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
02.06.2020, 15:45  [ТС] 4
Цитата Сообщение от zss Посмотреть сообщение
Если наибольшее по значению, то сначала перепишите в другую map моменяв местами значение и ключ.
получается да, мне надо по значению, у меня идет в ключе фамилия, а в значение месяц и зарплата, и вот мне надо 3 человека с максимальной зарплатой вывести.
как это переписать в другой map поменяв значение?
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
02.06.2020, 16:39 5
Цитата Сообщение от neChelovek31 Посмотреть сообщение
как это переписать в другой map поменяв значение
тут ничего мудреного нет:
C++
1
2
3
4
5
map<string,int> MSI;
map<int,string> MIS;
...
for(auto p=MSI.begin();p!=MSI.end();++p)
   MIS[p->second]=p->first;
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
02.06.2020, 16:50  [ТС] 6
zss, а я вот могу занести только например зп в ключ, если изначально оно было в значение вместе с месяцем, т.е. одно из значений перенести в ключ?
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
02.06.2020, 17:09 7
Я же не знаю, как у Вас map устроена. И какое значение надо сортировать.
Об этом TheCalligrapher, уже Вам писал.
При наличии полей более двух, я бы объединил их в структуры
C++
1
2
3
4
5
6
struct s1
{
    int year;
    int salary;
};
map<string,s1>
ключом будет name

C++
1
2
3
4
5
6
struct s2
{
  string name;
  int salary;
};
map<int,s2>
ключом будет year;
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
02.06.2020, 17:18  [ТС] 8
zss, получается у меня есть класс в котором три переменных по данным. Код я получается заношу как ключ, остальное добавляю в значение. По заданию мне нужно вывести три сотрудника с наибольшей зп, я так подумал, что еси можно менять ключ и значение, то может можно одно из значений поменять с ключом, чтоб потом выполнить сортировку по убыванию и вывести три первых элемента по ключу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Person {
private:
    int code, number, salary;
public:
friend  std::istream& operator>> (std::istream& in, Person& o) { // Переопределение оператора ввода
        std::cout << "Код сотрудника: "; in >> o.code;
        std::cout << "Месяц(1-12): "; in >> o.number;
        std::cout << "З/П: "; in >> o.salary;
        return in;
    }
    friend  std::ostream& operator<< (std::ostream& out, const Person& o) { // Переопределение оператора ввывода
        out << "Код сотрудника: " << o.code << std::endl << "Месяц: " << o.number << std::endl << "З/П: " << o.salary << std::endl;
        return out;
    }
};
int main(){
        Person p;
    std::map<int, Person> map;
    std::map<int, Person>::iterator iter;
        std::cin >> p; //ввод
    map[p.getCode()] = p;
        for (iter = map.begin(); iter != map.end(); iter++) { //вывод
    std::cout << (*iter).second << std::endl;///вывод на экран
            }
}
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
02.06.2020, 17:33 9
Сортировку выполнять не надо, map сортирует автоматически.
можете в первой
std::map<int, Person> map1;
в качестве ключа записывать значение code.
map1[p.getCode()] = p;
А потом в
std::map<int, Person> map2;
в качестве ключа записывать значение salary.
map2[p.getSary()] = p;

Кстати, забыл про то, что есть реверсный итератор
3 последних значения дадут
rbegin(), rbegin()+1, rbegin()+2
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
02.06.2020, 18:21  [ТС] 10
Цитата Сообщение от zss Посмотреть сообщение
А потом в
std::map<int, Person> map2;
в качестве ключа записывать значение salary.
получается заново не надо будет вводить данные? они те же будут?

Цитата Сообщение от zss Посмотреть сообщение
Сортировку выполнять не надо, map сортирует автоматически.
он сортирует по возрастанию, тогда мне нужно будет вывести с конца, но пока как именно вывести я тоже не разобрался, думал что то типа по индексу взять первые три, поэтому хотел использовать сортировку в другую сторону

Добавлено через 43 минуты
Вроде вот так он сортирует по зп, но с выводом трех макс. проблемки, я не понимаю что вот это значит rbegin(), rbegin()+1, rbegin()+2
C++
1
2
3
4
5
6
7
8
9
std::map<Person, int > map2;
for (auto p = map.begin(); p != map.end(); ++p) 
{
map2[p->second] = p->first;
}
for (auto p = map2.begin(); p != map2.end(); p++) 
{
std::cout << (*p).first << std::endl;
}
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
02.06.2020, 18:36 11
Вывод 3 элементов от конца
C++
1
2
3
4
for (auto p = map2.rbegin(); p != map2.rbegin()+3; p++) 
{
   std::cout << p->first << ': ' <<p->second << std::endl;
}
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
02.06.2020, 18:45  [ТС] 12
zss, Выходит вот такая ошибка
Миниатюры
Три наибольших элемента в ассоциативном контейнере map  
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
02.06.2020, 19:17 13
Я не вижу в коде
f
C++
1
2
3
4
or (auto p = map2.rbegin(); p != map2.rbegin()+3; p++) 
{
   std::cout << p->first << ': ' <<p->second << std::endl;
}
никакого минуса
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
02.06.2020, 19:22  [ТС] 14
zss, Вот я тоже не вижу, но ошибка не уходит вот полностью код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Person {
private:
    int code, number, salary;
public:
    Person() { code = 123401; number = 12;  salary = 0; }
    Person(const Person& person) {
        code = person.getCode();
        number = person.getNumber();
        salary = person.getSalary();
    }
    Person(int cod, int numb, int z) : code(cod), number(numb), salary(z) {};
    int getCode() const { return code; }
    int getNumber() const { return number; }
    int getSalary() const { return  salary; }
    friend  std::istream& operator>> (std::istream& in, Person& o) { // Переопределение оператора ввода
        std::cout << "Код сотрудника: "; in >> o.code;
        std::cout << "Месяц(1-12): "; in >> o.number;
        std::cout << "З/П: "; in >> o.salary;
        return in;
    }
    friend  std::ostream& operator<< (std::ostream& out, const Person& o) { // Переопределение оператора ввывода
        out << "Код сотрудника: " << o.code << std::endl << "Месяц: " << o.number << std::endl << "З/П: " << o.salary << std::endl;
        return out;
    }
 
}; 
int main() {
    setlocale(LC_ALL, "Russian");
    Person p;
    std::map<int, Person> map;
    std::map<int, Person>::iterator iter;
    std::cin >> p;
    map[p.getCode()] = p;
    for (iter = map.begin(); iter != map.end(); iter++) {
        std::cout << (*iter).second << std::endl;///вывод на экран
    }
    std::map<Person, int > map2;
    for (auto p = map.begin(); p != map.end(); ++p) {
        map2[(*p).second] = (*p).first;
    }
    for (auto p = map2.begin(); p != map2.end(); p++) {
        std::cout << (*p).first << std::endl;///вывод на экран
    }
    for (auto p = map2.rbegin(); p != map2.rbegin() + 3; p++)
    {
        std::cout << p->first << ': ' << p->second << std::endl;
    }
}
Добавлено через 36 секунд
Может поможет как то решить это
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
02.06.2020, 19:50 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Person p1;
    std::map<int, Person> map;
 
    for (int i = 0; i < 5; i++)
    {
        std::cin >> p1;
        map[p1.getCode()] = p1;
    }
 
 
    for (auto iter = map.begin(); iter != map.end(); iter++) {
        std::cout << iter->second << std::endl;///вывод на экран отсортированного по коду
    }
    std::map<int, Person > map2;
    for (auto p = map.begin(); p != map.end(); ++p) {
        map2[p->second.getSalary()] = p->second;
    }
    for (auto p = map2.begin(); p != map2.end(); ++p) {
        std::cout << p->second << std::endl; ///вывод на экран отсортированного по зарплате
    }
    
    for (auto p = map2.rbegin(); p!= map2.rbegin()+3; ++p){
        std::cout << p->second << std::endl; ///вывод на экран последних трех значений
    }
Кстати, если для создания 2 map использовать
C++
1
std::map<int, Person, less<int>() > map2;
т.е. сортировку задать по убыванию,
то 3 самых больших значения можно вывести и обычным итератором
C++
1
2
3
4
5
6
7
std::map<int, Person, less<int>() > map2;
    for (auto p = map.begin(); p != map.end(); ++p) {
        map2[p->second.getSalary()] = p->second;
    }
    for (auto p = map2.begin(); p != map2.begin()+3; ++p) {
        std::cout << p->second << std::endl;
    }
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
02.06.2020, 21:07  [ТС] 16
Цитата Сообщение от zss Посмотреть сообщение
Person p1;
    std::map<int, Person> map;
Ошибка так и не ушла, и я не понимаю почему. Получается у вас работает?

Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
т.е. сортировку задать по убыванию,
то 3 самых больших значения можно вывести и обычным итератором
а если вставлять вот этот кусок, то появляется еще одна ошибка, почти такая же только там теперь "+"
0
Модератор
Эксперт С++
13498 / 10752 / 6407
Регистрация: 18.12.2011
Сообщений: 28,692
03.06.2020, 08:41 17
neChelovek31, у Вас в коде в 37 строке была главная ошибка
std::map<Person,int> map2;
вместо
std::map<int, Person> map2;


может Вы ее не исправили?
0
0 / 0 / 0
Регистрация: 02.03.2020
Сообщений: 40
04.06.2020, 01:49  [ТС] 18
Цитата Сообщение от zss Посмотреть сообщение
Person p1;
    std::map<int, Person> map;
for (int i = 0; i < 5; i++)
    {
        std::cin >> p1;
        map[p1.getCode()] = p1;
    }
for (auto iter = map.begin(); iter != map.end(); iter++) {
        std::cout << iter->second << std::endl;///вывод на экран отсортированного по коду
    }
    std::map<int, Person > map2;
    for (auto p = map.begin(); p != map.end(); ++p) {
        map2[p->second.getSalary()] = p->second;
    }
    for (auto p = map2.begin(); p != map2.end(); ++p) {
        std::cout << p->second << std::endl; ///вывод на экран отсортированного по зарплате
    }
for (auto p = map2.rbegin(); p!= map2.rbegin()+3; ++p){
        std::cout << p->second << std::endl; ///вывод на экран последних трех значений
    }
я копировал вот это в main, здесь этой ошибки вроде нет, но ошибка в visual не ушла
0
04.06.2020, 01:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2020, 01:49
Помогаю со студенческими работами здесь

Задан массив. Найти три наибольших элемента
Желательно подправить код, у меня выводит один наибольший, заранее спасибо. #include...

Найти три наибольших элемента одномерного массива
Вот задание которые не понятно &quot;Найти три наибольших элемента одномерного массива X(20).&quot;

Найти три наибольших элемента матрицы 5х5
Найти три наибольших элемента двумерного массива(5х5), заполненного случайным образом.

Найти три наибольших элемента одномерного массива X(20)
Найти три наибольших элемента одномерного массива X(20) Мучаюсь уже очень долгое время. Дописал,...

Найти три наибольших элемента из данного набора
Дано целое число N (&gt; 3) и набор из N чисел. Найти три наибольших элемента из данного набора и...

Как найти три наибольших элемента массива за один просмотр
Помогите решить задачу!!! три наибольших элемента массива за один просмотр


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru