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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.94
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
#1

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

17.05.2012, 10:12. Просмотров 8001. Ответов 15
Метки нет (Все метки)

Вопрос первый:
как получить ключ контейнера 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. Получить ключ(элемент) и как записать все данные при объявлений? (C++):

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

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

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

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

Как получить элемент по ключу у map? - C++
Никак не могу понять что я делаю не так... У меня есть указатель std::map&lt;int,std::string&gt;* g; в коде я его инициализирую адресом на...

std::map, std::vector и порядок обхода коллекции - C++
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то всегда ли я буду получать тот-же...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:29 #2
1-й вопрос: Только идти по итераторам и делать It->second и проверять совпадает ли он с вашей строкой, тогда ответ it->first и никак иначе, в данной карте.
если уж, как вы говорите "грамотно" то map надо делать <string,int>, а не <int,string> в вашей задаче
По итераторам идти очень долго, дольше чем O(n), а поиск в карте по ключам осуществляется за O(logn)
Вопрос второй - нет, нельзя, да и не нужно
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.05.2012, 10:44 #3
Ternsip, 2) Можно. Читайте новый стандарт.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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;
}
Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 10:57 #5
MrGluck, да, я про это, этот поиск идёт за O(logn),это хорошо, но вдруг vendeme нужен отсорт по индексам ?
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
17.05.2012, 10:59 #6
Цитата Сообщение от Ternsip Посмотреть сообщение
но вдруг vendeme нужен осторт по индексам ?

Не по теме:

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

Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
17.05.2012, 11:04 #7
Цитата Сообщение от MrGluck Посмотреть сообщение

Не по теме:

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

Не по теме:

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

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

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

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

Добавлено через 55 секунд
разобрался
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2016, 12:01
Привет! Вот еще темы с ответами:

Стоит ли очищать в деструкторе std::map , std::vecotor? - C++
У меня ещё один нубский вопрос :) Вот если в классе объявлены мапы и вектора, которые по ходу программы как то заполняются, нужно ли мне...

Как формируется размер std::map? - C++
ожидал увидеть размер 18. По 5 байт на две строки и по 4 байта на два int-а. Но результат 48. Почему? Как то связано с выравниванием...

Как реализован .end() std::map? - C++
Как реализован .end() std::map? Не понимаю, какая у него реализация. Либо он указывает на root дерева, либо на фиктивную ноду либо на что...

Контейнер Map. Использование класса как ключ - C++
class A{ int X;}; class B{ public: int y;}; int main() { A objA; B objB; map&lt;A,B&gt; m; m.y=1; //kak? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.02.2016, 12:01
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru