Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/286: Рейтинг темы: голосов - 286, средняя оценка - 4.84
 Аватар для vendeme
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88

std::map find. Получить ключ(элемент) и как записать все данные при объявлений?

17.05.2012, 10:12. Показов 53945. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос первый:
как получить ключ контейнера map по данным?
например:
C++
1
2
3
4
5
6
// id, name
std::map<int, string> BookMap;
BookMap bookmap;
bookmap[0] = "Pushkin";
bookmap[12] = "Esenin";
bookmap[16] = "Mayakovski";
Теперь мне нужно узнать id у Mayakovski. Как это сделать грамотно?
Вопрос второй:
Можно ли map инициализировать как простой массив?
C++
1
int mass[3] = { 0, 12, 16 }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2012, 10:12
Ответы с готовыми решениями:

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...

Почему map.find не доработают для std::find
Добрый вечер, вопрос философский о разработчиках стандарта и последующих имплементациях компиляторов: &quot;Почему map::iterator не...

Составной ключ для std::map
Есть класс. Нужно его сделать ключем для карты. class Vertex{ public: double X,Y,Z; Vertex(double x=0,double y=0, double...

16
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:29
1-й вопрос: Только идти по итераторам и делать It->second и проверять совпадает ли он с вашей строкой, тогда ответ it->first и никак иначе, в данной карте.
если уж, как вы говорите "грамотно" то map надо делать <string,int>, а не <int,string> в вашей задаче
По итераторам идти очень долго, дольше чем O(n), а поиск в карте по ключам осуществляется за O(logn)
Вопрос второй - нет, нельзя, да и не нужно
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.05.2012, 10:44
Ternsip, 2) Можно. Читайте новый стандарт.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 10:47
как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, int> BookMap;
    BookMap["Pushkin"] = 0;
    BookMap["Esenin"] = 12;
    BookMap["Mayakovski"] = 16;
    std::cout<< BookMap.find("Mayakovski")->second;
    return 0;
}
1
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:57
MrGluck, да, я про это, этот поиск идёт за O(logn),это хорошо, но вдруг vendeme нужен отсорт по индексам ?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 10:59
Цитата Сообщение от Ternsip Посмотреть сообщение
но вдруг vendeme нужен осторт по индексам ?

Не по теме:

А ля Мсье извращенец?

0
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:04
Цитата Сообщение от MrGluck Посмотреть сообщение

Не по теме:

А ля Мсье извращенец?

Не по теме:

:D Виноват, очепятка =), уже пофиксил :-[ осторт -> отсорт (сортировка)

0
 Аватар для vendeme
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:37  [ТС]
Цитата Сообщение от Ternsip Посмотреть сообщение
если уж, как вы говорите "грамотно" то map надо делать <string,int>, а не <int,string> в вашей задаче
не верно, ключом является ID.

Добавлено через 2 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, int> BookMap;
    BookMap["Pushkin"] = 0;
    BookMap["Esenin"] = 12;
    BookMap["Mayakovski"] = 16;
    std::cout<< BookMap.find("Mayakovski")->second;
    return 0;
}
при таком раскладе я получаю крэш, и так раньше пробовал
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.05.2012, 11:39
Цитата Сообщение от vendeme Посмотреть сообщение
при таком раскладе я получаю крэш, и так раньше пробовал
Значит, элемента с таким ключом в мапе не было.
Тогда find возвращает итератор на свой конец, который нельзя разыменовывать, иначе может случится страшное(например, креш).
2
 Аватар для vendeme
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:52  [ТС]
я кажется кое что не понимаю с map.
Ведь first указывает на ключ, а second на данные.
C++
1
bookMap[0] = "Pushkin"
разве так не верно?

Добавлено через 4 минуты
ну верно, а почему тогда конструкция
int id = bookMap.find("Pushkin")->second;
не пашет?

Добавлено через 1 минуту
Вот общий код
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    map<uint32, string> BookMap;
    BookMap[0] = "Puskkin";
    BookMap[12] = "Esenin";
    BookMap[16] = "Mayakovski";
    uint32 id = BookMap.find("Mayakovski")->first;
    cout << id << endl;
    cin.get();
}
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.05.2012, 11:56
Потому что мап ищет по ключу(у вас это id).
Поэтому вам остается только перебирать мапу за O(n).
1
 Аватар для vendeme
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:59  [ТС]
Ну тогда я перепутал с контейнером, буду юзать старый дедовский многомерный массив
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
17.05.2012, 14:05
Елси есть желание искать и по ключу, и по значению, и имеется boost, то там есть bimap:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
 
#include <boost/bimap.hpp>
 
 
int main() {
   typedef boost::bimap<int, std::string>   map_type;
 
   map_type map;
   map.insert(map_type::value_type(1, "Pushkin"));
   map.insert(map_type::value_type(3, "Lermontov"));
   map.insert(map_type::value_type(6, "Tolstoy"));
   
   std::cout << "map.left[1] = " << map.left.find(1)->second << std::endl;
   std::cout << "map.right[\"Tolstoy\"] = " << map.right.find("Tolstoy")->second << std::endl;
}
http://liveworkspace.org/code/... 87e0874fc5
А в std::map да, придётся перебирать все значения.
4
 Аватар для Ternsip
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
18.05.2012, 12:14
vendeme, А вы юморист

Вы писали

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, int> BookMap;
    BookMap["Pushkin"] = 0;
    BookMap["Esenin"] = 12;
    BookMap["Mayakovski"] = 16;
    std::cout<< BookMap.find("Mayakovski")->second;
    return 0;
}

Как нужно, если вам "наплевать" на порядок следования индексов (в итераторах) :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, int> BookMap;
    BookMap["Pushkin"] = 0;
    BookMap["Esenin"] = 12;
    BookMap["Mayakovski"] = 16;
    if (BookMap.count("Mayakovski")==0) std::cout<<"INVALID KEY";else std::cout<<BookMap["Mayakovski"];
    system("PAUSE");
    return 0;
}
Только count долго проверяет, так что можно ещё через find вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, int> BookMap;
    BookMap["Pushkin"] = 0;
    BookMap["Esenin"] = 12;
    BookMap["Mayakovski"] = 16;
    if (BookMap.find("Mayakovski")==BookMap.end()) std::cout<<"INVALID KEY";else std::cout<<BookMap["Mayakovski"];
    system("PAUSE");
    return 0;
}
И если грамотно то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
 
int main()
{
    std::map<std::string, int> BookMap;
    std::map<std::string, int>::iterator it;
    BookMap["Pushkin"] = 0;
    BookMap["Esenin"] = 12;
    BookMap["Mayakovski"] = 16;
    it=BookMap.find("Mayakovski");
    if (it==BookMap.end()) std::cout<<"INVALID KEY";else std::cout<<it->second;
    system("PAUSE");
    return 0;
}
2
2 / 2 / 1
Регистрация: 06.10.2015
Сообщений: 91
20.02.2016, 12:01
Ternsip, это пример для string int - все работает верно.
Я сейчас смотрю ассоциативный контейнер по string string и это не работает

Добавлено через 1 минуту
Подскажите кто знает как получить итератор по поиску string? Он по первому искать надо.

Добавлено через 38 секунд

Добавлено через 55 секунд
разобрался
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
20.02.2016, 14:54
Цитата Сообщение от DSpade Посмотреть сообщение
разобрался
Если вопрос был решен вами самостоятельно, отпишите об этом в своей теме - есть и другие люди, которые столкнутся с той же проблемой, и им поможет ваш ответ.
0
0 / 0 / 0
Регистрация: 25.03.2022
Сообщений: 1
27.03.2022, 16:50
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
49
50
#include <iostream>
#include <vector>
#include <iterator>
#include <map>
#include <set>
#include <iomanip>
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "ru");
    multimap<int, int> map;
    multimap<int, int>::iterator it;
    it = map.begin();
    int* a;//Объявление и заполнение массива
    cout << "Введи размер массива: ";
    int r;
    cin >> r;
    a = new int[r];
    for (int i = 0; i < r; i++) {
        cout << "Введите элементы: ";
        cin >> a[i];
    }
    for (int i = 0; i < r; i++) {//Заполнение map данными массива, где ключом  является идекс
        map.emplace(i, a[i]);
    }
    it = map.begin();//Вывод получченого массива
    while (it != map.end()) {
        cout << "[" << it->first << "]" << " = " << it->second << "\t" << endl;
        it++;
    }
    //нахождение идекса искомого элемента
    //По моему прикольно :)
    //Итератор итак увеличивается на 1 в 41 строке, поэтому в цикле while it++ не  нужно писать
    int b;
    cout << "Введите искомый элемент: ";
    cin >> b;
    it = map.begin();
    while (it != map.end()) {
        for (int i = 0; i < r; i++) {
            it = map.find(i);
            if (it->second == b) {
                cout << "Его индекс = " << it->first;
                goto link;//Без него не обойтись, break не справится :(
            }
        }
    }
link:
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2022, 16:50
Помогаю со студенческими работами здесь

Std::map ключ из нескольких значений (одно из которых может быть не заполненно)
Добрый день. Есть следующий вопрос. У меня есть некие 2 транзакции, которые необходимо связать между собой. Связываю я их по id,...

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и перезаписи struct pStruct { int...

std:: find Не нашла элемент
Как узнать, что std:: find не нашла элемент? Я почитал, что возвращает итератор на последний элемент... Т.е. почему у меня при ...

Очистка map и перевернутого std::map c std::greater
Написала я программу, которая заполняет два контейнера map. a,b. вывод программы такой 11 a: 0.00000000 - 0.00000000 a: 0.10000000...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru