Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.94
vendeme
 Аватар для vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 10:12     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #1
Вопрос первый:
как получить ключ контейнера 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 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2012, 10:12     std::map find. Получить ключ(элемент) и как записать все данные при объявлений?
Посмотрите здесь:

std::map, std::vector и порядок обхода коллекции C++
C++ std:: find Не нашла элемент
C++ Составной ключ для std::map
Стоит ли очищать в деструкторе std::map , std::vecotor? C++
как получить элемент по ключу у map ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:29     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #2
1-й вопрос: Только идти по итераторам и делать It->second и проверять совпадает ли он с вашей строкой, тогда ответ it->first и никак иначе, в данной карте.
если уж, как вы говорите "грамотно" то map надо делать <string,int>, а не <int,string> в вашей задаче
По итераторам идти очень долго, дольше чем O(n), а поиск в карте по ключам осуществляется за O(logn)
Вопрос второй - нет, нельзя, да и не нужно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.05.2012, 10:44     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #3
Ternsip, 2) Можно. Читайте новый стандарт.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
17.05.2012, 10:47     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #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;
}
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:57     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #5
MrGluck, да, я про это, этот поиск идёт за O(logn),это хорошо, но вдруг vendeme нужен отсорт по индексам ?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
17.05.2012, 10:59     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #6
Цитата Сообщение от Ternsip Посмотреть сообщение
но вдруг vendeme нужен осторт по индексам ?

Не по теме:

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

Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:04     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #7
Цитата Сообщение от MrGluck Посмотреть сообщение

Не по теме:

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

Не по теме:

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

vendeme
 Аватар для vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:37  [ТС]     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #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;
}
при таком раскладе я получаю крэш, и так раньше пробовал
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.05.2012, 11:39     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #9
Цитата Сообщение от vendeme Посмотреть сообщение
при таком раскладе я получаю крэш, и так раньше пробовал
Значит, элемента с таким ключом в мапе не было.
Тогда find возвращает итератор на свой конец, который нельзя разыменовывать, иначе может случится страшное(например, креш).
vendeme
 Аватар для vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:52  [ТС]     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #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();
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
17.05.2012, 11:56     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #11
Потому что мап ищет по ключу(у вас это id).
Поэтому вам остается только перебирать мапу за O(n).
vendeme
 Аватар для vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
17.05.2012, 11:59  [ТС]     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #12
Ну тогда я перепутал с контейнером, буду юзать старый дедовский многомерный массив
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
17.05.2012, 14:05     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #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/c6fc97...233087e0874fc5
А в std::map да, придётся перебирать все значения.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
18.05.2012, 12:14     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #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;
}
DSpade
2 / 2 / 2
Регистрация: 06.10.2015
Сообщений: 86
20.02.2016, 12:01     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #15
Ternsip, это пример для string int - все работает верно.
Я сейчас смотрю ассоциативный контейнер по string string и это не работает

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

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

Добавлено через 55 секунд
разобрался
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2016, 14:54     std::map find. Получить ключ(элемент) и как записать все данные при объявлений?
Еще ссылки по теме:

Как можно считывать из строки (std::string или char*) данные при помощи cin C++
C++ Как заменить в файле строку, используя std::map?
Контейнер Map. Использование класса как ключ C++

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
3077 / 1322 / 164
Регистрация: 20.02.2013
Сообщений: 3,760
Записей в блоге: 17
20.02.2016, 14:54     std::map find. Получить ключ(элемент) и как записать все данные при объявлений? #16
Цитата Сообщение от DSpade Посмотреть сообщение
разобрался
Если вопрос был решен вами самостоятельно, отпишите об этом в своей теме - есть и другие люди, которые столкнутся с той же проблемой, и им поможет ваш ответ.
Yandex
Объявления
20.02.2016, 14:54     std::map find. Получить ключ(элемент) и как записать все данные при объявлений?
Ответ Создать тему
Опции темы

Текущее время: 05:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru