powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::map и поиском в нем.
14 сообщений из 14, страница 1 из 1
std::map и поиском в нем.
    #39107233
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите плс. разобраться с коллекциями в частности с map и поиском в нем.
Итак, создаю и заполняю map:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
std::map<double, double> mymap;
mymap.insert ( pair<double, double>(tmp,result) ); //Это в цикле делаю

for (auto it = mymap.begin(); it != mymap.end(); ++it)//вывожу все
{
     cout << it->first << " : "<< it->second << endl;
}

std::cout << "key=117.55 value=" << (mymap.find(117.55))->second << std::endl;
// выводит 0, хотя там реально другое значение



Вопросы:
1. как можно просто по ключу получить значение?
2. как с максимальной скоростью получить значение? (как использовать std::binary_search для std::map - если это возможно? )
3. как в линуксе получить системное время в миллисекундах? (хочу замерить время выполнения кода)

Модератор: не забывай выделять код тэгом SRC
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107319
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если сделать?
Код: plaintext
1.
assert(mymap.find(117.55) != mymap.end());


может 117.55 на самом деле не совсем 117.5 :)
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107363
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присвоить значение:
Код: plaintext
1.
mymap[key] = value;


Проверить есть ли значение:
Код: plaintext
1.
if(mymap.find(117.55) == mymap.end()) cout << "Не найдено"


Получить значение:
Код: plaintext
1.
cout << mymap[key] ...


В твоем примере главный косяк в том что key имеет тип double, т.к. для double нельзя делать проверку на равенство без учета погрешности. А мап по умолчанию использует именно равенство, т.е. тебе надо еще реализовать свой компаратор

binary_search для мап не нужен, поиск изначально оптимизирован.

Замеряй с помощью стандартного clock() - в линуксе дает время сколько молотил процессор.

Про мап (и не только) тут с примерами http://www.cplusplus.com/reference/map/map/
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107469
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Время можно и через std::chrono померить, а вот с double ключами даже и предложить-то нечего.
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107511
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wstВремя можно и через std::chrono померить, а вот с double ключами даже и предложить-то нечего.

Ну как нечего ? Можно предложить int или long или long long ключи с отмасштабированными соотв. образом значениями.
(*100, *1000 и так далее.)
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107528
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivwstВремя можно и через std::chrono померить, а вот с double ключами даже и предложить-то нечего.

Ну как нечего ? Можно предложить int или long или long long ключи с отмасштабированными соотв. образом значениями.
(*100, *1000 и так далее.) диапазон значений double выходит далеко за long long. Это ведь числа с порядком. Оно даже целое может иметь длинный хвост из нулей. А если есть дробная часть, то на самом деле может быть много девяток или единичка на хвосте из нулей:

123e45
1.2999999999999998 -> 1.3
1.3000000000000001 -> 1.3
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107739
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabдиапазон значений double выходит далеко за long long. Это ведь числа с порядком. Оно даже целое может иметь длинный хвост из нулей.

Это понятно, но в мапе не может быть ключа с бесконечным числом значений всё равно.
Предполагается, что ТС сознательно ограничит точность входных данных у себя.
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107789
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ключ-то может быть, вопрос лишь в том удастся ли им воспользоваться как задумано.
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107803
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем откликнувшимся, про ключ типа double понял что его нельзя использовать,
а если этот ключ привести к стрингу или массиву символов то должно работать? (разумеется для извлечения значения придется снова ключ приводить к нужному типу, это уже вопрос теории а не для реального использования map)
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107870
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Число разных значений некой величины из N бит в точности равно 2^N.
double и long long имеют одинаковый размер (64 бита), но правила работы с целым числом просты, а с вещественным - не тривиальны.
Возникает вопрос - зачем усложнять себе жизнь и использовать вместо ключа что-то отличное от (длинного) целого?
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107871
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_KaПомогите плс. разобраться с коллекциями в частности с map и поиском в нем.
Итак, создаю и заполняю map:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
std::map<double, double> mymap;
mymap.insert ( pair<double, double>(tmp,result) ); //Это в цикле делаю

for (auto it = mymap.begin(); it != mymap.end(); ++it)//вывожу все
{
     cout << it->first << " : "<< it->second << endl;
}

std::cout << "key=117.55 value=" << (mymap.find(117.55))->second << std::endl;
// выводит 0, хотя там реально другое значение



Вопросы:
1. как можно просто по ключу получить значение?

используй lower_bound
как то так
Код: plaintext
1.
2.
auto res_ge = mymap.lower_bound(117.55);   // точное значение или первое больше ключа. 
auto res_l = --res_ge;                     // первое меньше ключа 


ну и не забывай проверять итераторы на end() и begin()
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107899
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YesSqlиспользуй lower_bound

осторожно!

какой из них больше?

1.2999999999999998 -> 1.3
1.3000000000000001 -> 1.3

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

а если точность ключей изначально ограничена, т.е. они уже округлены, положим до 5 разрядов, то можно искать например key*0.99999999 , т.е. значение чуть меньше нужного.
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107915
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenabYesSqlиспользуй lower_bound

осторожно!

какой из них больше?

1.2999999999999998 -> 1.3
1.3000000000000001 -> 1.3

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

а если точность ключей изначально ограничена, т.е. они уже округлены, положим до 5 разрядов, то можно искать например key*0.99999999 , т.е. значение чуть меньше нужного.

Код: plaintext
1.
assert(1.2999999999999998 == 1.3000000000000001);



через lower_bound получаем два ближайших и решаем что подходит а что нет.
...
Рейтинг: 0 / 0
std::map и поиском в нем.
    #39107983
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabа если точность ключей изначально ограничена, т.е. они уже округлены, положим до 5 разрядов, то можно искать например key*0.99999999 , т.е. значение чуть меньше нужного.
если точность ключей ограничена то их значения детерминированы, и никаких специальных ухищрений не надо.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::map и поиском в нем.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]