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

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

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

Author24 — интернет-сервис помощи студентам
Вопрос первый:
как получить ключ контейнера 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2012, 10:12
Ответы с готовыми решениями:

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

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

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

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

16
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:29 2
1-й вопрос: Только идти по итераторам и делать It->second и проверять совпадает ли он с вашей строкой, тогда ответ it->first и никак иначе, в данной карте.
если уж, как вы говорите "грамотно" то map надо делать <string,int>, а не <int,string> в вашей задаче
По итераторам идти очень долго, дольше чем O(n), а поиск в карте по ключам осуществляется за O(logn)
Вопрос второй - нет, нельзя, да и не нужно
2
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.05.2012, 10:44 3
Ternsip, 2) Можно. Читайте новый стандарт.
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 10:47 4
как-то так
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
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:57 5
MrGluck, да, я про это, этот поиск идёт за O(logn),это хорошо, но вдруг vendeme нужен отсорт по индексам ?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.05.2012, 10:59 6
Цитата Сообщение от Ternsip Посмотреть сообщение
но вдруг vendeme нужен осторт по индексам ?

Не по теме:

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

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

Не по теме:

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

Не по теме:

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

0
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:37  [ТС] 8
Цитата Сообщение от 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
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.05.2012, 11:39 9
Цитата Сообщение от vendeme Посмотреть сообщение
при таком раскладе я получаю крэш, и так раньше пробовал
Значит, элемента с таким ключом в мапе не было.
Тогда find возвращает итератор на свой конец, который нельзя разыменовывать, иначе может случится страшное(например, креш).
2
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:52  [ТС] 10
я кажется кое что не понимаю с 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
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.05.2012, 11:56 11
Потому что мап ищет по ключу(у вас это id).
Поэтому вам остается только перебирать мапу за O(n).
1
32 / 4 / 0
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:59  [ТС] 12
Ну тогда я перепутал с контейнером, буду юзать старый дедовский многомерный массив
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
17.05.2012, 14:05 13
Елси есть желание искать и по ключу, и по значению, и имеется 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
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
18.05.2012, 12:14 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 15
Ternsip, это пример для string int - все работает верно.
Я сейчас смотрю ассоциативный контейнер по string string и это не работает

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

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

Добавлено через 55 секунд
разобрался
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
20.02.2016, 14:54 16
Цитата Сообщение от DSpade Посмотреть сообщение
разобрался
Если вопрос был решен вами самостоятельно, отпишите об этом в своей теме - есть и другие люди, которые столкнутся с той же проблемой, и им поможет ваш ответ.
0
0 / 0 / 0
Регистрация: 25.03.2022
Сообщений: 1
27.03.2022, 16:50 17
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
27.03.2022, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2022, 16:50
Помогаю со студенческими работами здесь

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

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

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

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


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

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