Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
3 / 2 / 1
Регистрация: 14.10.2012
Сообщений: 50
1

Заполнить вектор структур, посчитать количество дубликатов имен

01.09.2018, 08:16. Показов 1540. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно посчитать количество дубликатов именов и вывести число и имя каждого структа. Но не получается, совсем ничего не выводится. Вот что сделал:
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
struct duplicateNames
{
string name;
int count;
};
vector<duplicateNames> UnApprovedNames;
vector<string> unapprovednames = {\*здесь много имен\*};
for ( string name : unapprovednames)
    {
    for (std::vector<duplicateNames>::iterator it = UnApprovedNames.begin() ; it != UnApprovedNames.end(); ++it)
        {
            if (name == (*it).name)
            {
                ++(*it).count;
                cout << (*it).count << ": " << (*it).name << endl;
            }
            else
            {
              (*it).name = name;
              (*it).count = 0;
               cout << (*it).count << ": " << (*it).name << endl;
            }
        }
    }
    for (auto entry : UnApprovedNames)
        cout << entry.count << ": " << entry.name << endl;
Что поправить нужно? Спасибо!

Добавлено через 16 минут
Походу причина в том, что внутренный цикл никогда не выполняется. Как же правильно заносить в вектор записи о именах и количество?

Добавлено через 1 час 1 минуту
Сделал пока как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    bool check = false;
    for ( string name : unapprovednames)
    {
        for (std::vector<duplicateNames>::iterator it = UnApprovedNames.begin() ; it != UnApprovedNames.end(); ++it)
        {
            if (name == (*it).name)
            {
                ++(*it).count;
                check = true;
                break;
            }
            check = false;
        }
        if (check == false)
        {
            duplicateNames temp = {name, 1};
            UnApprovedNames.push_back(temp);
        }
    }
Но чет как-то неуклюже вышло. Как можно покороче и изящнее сделать?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2018, 08:16
Ответы с готовыми решениями:

не получается заполнить вектор структур
Есть вектор структур class Console { public: struct MyStruct { int begin_M; int end_M;...

Как заполнить вектор массивом из структур?
как заполнить вектор массивом из структур? Как заполнять вектор простыми объектами( int, string,...

Вектор структур, как заполнить определенное поле
Есть вектор структур. В структуре несколько элементов. Заполнил вектор нужными мне элементами,...

Биграммы текста и их количество поместить в вектор структур
Доброго всем здравия, духовного и телесного. Сделал, все работает как надо. Но код получился ну...

4
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
01.09.2018, 08:19 2
Через std:map
1
223 / 188 / 97
Регистрация: 15.04.2018
Сообщений: 718
01.09.2018, 11:24 3
Цитата Сообщение от Рольф Посмотреть сообщение
Но чет как-то неуклюже вышло. Как можно покороче и изящнее сделать?
Если последний вариант кода работает, то вполне всё опрятно.

Как написал Manowar, можно это сделать через std::map, решение получиться поменьше, но ваше решение от этого не становиться неправильным
1
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
01.09.2018, 12:02 4
Лучший ответ Сообщение было отмечено Рольф как решение

Решение

Цитата Сообщение от Рольф Посмотреть сообщение
Но чет как-то неуклюже вышло. Как можно покороче и изящнее сделать?
если хочется поизвращаться и не использовать std::map, то изящнее наверное будет как-то так
C++
1
2
3
4
5
6
for(std::string str : unapprovednames) {          
        auto n = std::find_if(UnApprovedNames.begin(), UnApprovedNames.end(), 
                [&str](const duplicateNames & n) { return str == n.name; });
        if(n != UnApprovedNames.end()) (*n).count++;
        else UnApprovedNames.push_back({str, 1});
    }
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
01.09.2018, 15:06 5
C++
1
2
3
4
5
6
7
8
9
std::unordered_map<string, size_t> counter;
for(const string& name: unapprovednames)
{
    counter[name]++;
}
for(const std::pair<string, size_t>& k_v: counter)
{
    std::cout<<k_v.first<<" "<<k_v.second<<std::endl;
}
1
01.09.2018, 15:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2018, 15:06
Помогаю со студенческими работами здесь

Заполнить вектор структур
#include &lt;vector&gt; TForm1 *Form1; struct schedule { int trainnumber; AnsiString from;...

Заполнить массив случайными числами. Посчитать количество элементов, кратных 2 и 5
Заполнить массив случайными числами (положительными и отрицательными) из произвольного диапазона....

Дан вектор,требуется посчитать количество элементов вектора,отличных от его последнего элемента.
Помогите,пожалуйста,вопрос жизни и смерти).

Заполнить массив вводом с клавиатуры, посчитать количество четных элементов массива
Заполнить массив вводом с лавиатуры, посчитать кол-во четных элементов массива.


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

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