Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53

Перебор ключей карты в классе

20.04.2019, 19:38. Показов 8185. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс с private картой. Как я могу циклом получить список ключей из внешней функции? Если бы карта была public я бы мог перебрать данные итераторами, но как грамотно сделать это в данном случае?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ClassWithMap
{
public:
    string getKey(?)
    {
        // Что написать здесь
    }
private:
    map<string, int> someMap;
};
 
void someFunc()
{
    ClassWithMap myData;
    for(?)
    {
        doSomething(myData.getKey(?);
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2019, 19:38
Ответы с готовыми решениями:

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

Перебор ключей по значению в словаре
Как можно перебрать значения словаря, чтобы получить ключи? К примеру в словаре A при вводе пользователем &quot;1 2 3&quot; на экран...

Перебор ключей в INI-файлах
Приветствую, ребята. Подскажите пожалуйста, как перебрать ключи из определенной секции ini-файла ?

25
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
20.04.2019, 19:58
ну выдавай константную ссылку на массив. (картой обычно их не зовут это либо мапа, либо ассоциативный массив по-русски)
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
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
class ClassWithMap
{
public:
    const map<string, int>& getMap() const
    {
        return someMap;
    }
    ClassWithMap() {
        someMap["aaa"] = 1;
        someMap["bab"] = 2;
    }
private:
    map<string, int> someMap;
};
 
void someFunc()
{
    ClassWithMap myData;
    for (auto& item: myData.getMap())
    {
        cout << item.first;
    }
}
int main() {
    someFunc();
}
2
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 20:18  [ТС]
Kuzia domovenok, извиняюсь, если вопрос не очень грамотный, но это считается хорошим подходом? Насколько я знаю пользователь класса не должен быть осведомлён о том, что происходит внутри, а так получается, что это не совсем верно. Или я ошибаюсь?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
20.04.2019, 20:27
Explain, конечно не считается, но какой уж есть. тебе же зачем-то понадобился цикл вне класса. придётся пописать говнокод. Мы не привередливые.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
20.04.2019, 20:32
Explain, можно просто определить итератор в своем классе на базе итератора контейнера
1
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 20:37  [ТС]
Kuzia domovenok, разве нет иного способа? Возможно я не совсем грамотно описал задачу. Есть private мапа, мне нужны все включи во внешней функции.

Кстати среда ругается:
C++
1
2
3
4
for(auto& item: myData.getMap())
{
    doSomething(item.first); // member reference base type 'const int' is not a structure or union
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
20.04.2019, 20:42
zayats80888, а смысл? то же самое предоставление полного доступа к контейнеру
Explain, всё показывай.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
20.04.2019, 20:45
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
то же самое предоставление полного доступа
не совсем, можно ограничить только чтением
C++
1
2
3
4
5
6
7
8
9
10
class ClassWithMap
{
public:
    typedef std::map<std::string, int>::const_iterator iter;
 
    iter begin() const { return someMap.cbegin(); }
    iter end() const { return someMap.cend(); }
private:
    std::map<std::string, int> someMap;
};
1
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 20:55  [ТС]
Kuzia domovenok, переписал данные, чтобы было легче объясняться. Класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class human
{
public:
    human()
    {
        people["Petrov"] = 30;
        people["Smirnov"] = 40;
    }
    int getAge(string family)
    {
        return people.value(family);
    }
 
private:
    map<string, int> people; // Key - family. Value - age.
};
Отдельная функция:
C++
1
2
3
4
5
6
7
8
9
void fillFamiliesList()
{
    human myWorkers;
    vector<string> families;
    for(?)
    {
        families.insert(get family one by one from myWorkers)
    }
}
zayats80888, опять же не посчитают ли это грубым? Просто я не для себя или преподавателя, хотелось бы сделать в лучшем виде.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
20.04.2019, 21:02
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
class human
{
public:
    human();
    {
        people["Petrov"] = 30;
        people["Smirnov"] = 40;
    }
    double getAge(string family)
    {
        return people.value(family);
    }
vector<string> FamiliesList()
{
    vector<string> families;
    for(auto item: people)
    {
        families.push_back(item.first);
    }
    return families;
}
 
private:
    map<string, int> people; // Key - family. Value - age.
};
void fillFamiliesList()
{
    human myWorkers;
    vector<string> families(myWorkers.FamiliesList() );
}
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
20.04.2019, 21:04
Лучший ответ Сообщение было отмечено Explain как решение

Решение

Explain,
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
class human
{
public:
    typedef std::map<std::string, int>::const_iterator iter;
 
    human()
    {
        people["Petrov"] = 30;
        people["Smirnov"] = 40;
    }
 
    iter begin() const { return people.cbegin(); }
    iter end() const { return people.cend(); }
private:
    std::map<std::string, int> people; // Key - family. Value - age.
};
 
void fillFamiliesList()
{
    human myWorkers;
    std::vector<std::string> families;
    for (auto p : myWorkers )
    {
        families.push_back(p.first);
    }
}
Добавлено через 1 минуту
Цитата Сообщение от Explain Посмотреть сообщение
опять же не посчитают ли это грубым?
почему грубым? Пользователю доступен только просмотр контейнера, не более того.
1
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 21:35  [ТС]
zayats80888, я так понимаю first это итератор, можете подсказать как правильно его разыменовать? Например, если мне надо отправить фамилию аргументом. Полагаю стоило сразу в такой форме свой код выложить, извиняюсь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void fillFamiliesList()
{
    human myWorkers;
    for (auto p : myWorkers )
    {
        writeFamily(*(p.first)); // member reference base type 'const int' is not a structure or union
    }
}
 
void writeFamily(string family)
{
    cout << family << endl;
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
20.04.2019, 21:41
Цитата Сообщение от Explain Посмотреть сообщение
я так понимаю first это итератор
Нет, итератор std::map при разыменовании возвращает пару std::pair, а first и second соответственно ссылки на ключ и его значение
1
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 21:42  [ТС]
Kuzia domovenok, опять же, возможно я не прав, но выглядит немного избыточным создание и заполнение вектора внутри класса, когда у нас уже есть эти данные просто немного в другом виде.

zayats80888, как ни странно всё та же ошибка. Возможно дело в том, что пишу на Qt с QMap?

C++
1
writeFamily(p.first); // member reference base type 'const int' is not a structure or union
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
20.04.2019, 21:44
Цитата Сообщение от Explain Посмотреть сообщение
writeFamily(*(p.first));
не нужно разыменовывать, просто
C++
1
writeFamily(p.first);
Добавлено через 40 секунд
и лучше так:
C++
1
2
3
4
void writeFamily(const string& family)
{
    cout << family << endl;
}
1
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 21:47  [ТС]
zayats80888, изначально пробовал как вы писали, сообщение выше скорректировал.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
20.04.2019, 21:48
Цитата Сообщение от Explain Посмотреть сообщение
как ни странно всё та же ошибка. Возможно дело в том, что пишу на Qt с QMap?
попробуйте p->first
0
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 21:49  [ТС]
zayats80888, пишет, что first - это не указатель.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
20.04.2019, 21:50
Explain, покажите весь код
0
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
20.04.2019, 21:59  [ТС]
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
class human
{
public:
    human(); // Запись данных в people
    QMap<QString, double>::const_iterator begin() const { return people.cbegin(); }
    QMap<QString, double>::const_iterator end() const { return people.cend(); }
    const QMap<QString, int>& getData() const
    {
        return people;
    }
 
private:
    QMap<QString, int> people; // Key - family. Value - age.
};
 
void fillFamilies()
{
    human myWorkers;
    for(auto p : myWorkers)
    {
        writeFamily(p.first); // member reference base type 'const int' is not a structure or union
    }
}
 
void writeFamily(const string& family)
{
    cout << family << endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.04.2019, 21:59
Помогаю со студенческими работами здесь

Перебор одинаковых ключей посредством foreach
Проблема в том что foreach как буд-то игнорирует повторяющийся ключ( в данной проге это &quot;толик&quot;) ...

Вывод значения ключей массива по условию совпадения других ключей
Есть массив $arElements Array ( =&gt; Array ( =&gt; first =&gt; Name =&gt;...

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

Массив ключей из ключей двух массивов
Добрый день. Необходимо собрать все ключи с двух массивов как можно эффективнее и менее ресурсозатратно. Например есть два...

Полный перебор и сокращенный перебор, путем исключения одного цикла
1) Разработать на основе метода полного перебора программу razmen1 для решения задачи о способах размена купюры достоинством 100 условных...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru