Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168

Фильтр map

02.03.2018, 17:42. Показов 1996. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите пожалуйста, как можно отфильтровать map только по дате (датам), и подсчитать quantity.

Модно ли создать фильтр и видеть только отфильтрованные значения
к примеру только на дату 2018.03.02 или 2018.01.01-2018.03.02

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct sdate  
{   int year;  int month;  int day;  };
 
 struct stime  
{ int hour; int mines; int quantity; };
 
 struct sdate_time
 {   sdate date_;   stime time_;  };
 
 struct  all_trade
 {   int quantity;  };
 
map<sdate_time, all_trade> all_trade_;
Если кто знает подскажите пожалуйста.
С уважением, Александр

Добавлено через 2 часа 36 минут
Советов нет((
сделал по такой схеме

C++
1
2
3
        typedef  map<i_time, one_trade> type_one_trades;
    type_one_trades  m_one_trades{};
    map<i_date, type_one_trades> m_day_trades{};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2018, 17:42
Ответы с готовыми решениями:

Обращение к элементам vector, который находится в map, находящийся в map
Всем добрый день! Имеется такой контейнер. Как обращаться к элементам вектора и как пушбэчить его? map...

Поместить вектора в map и реализовать перегрузку вывода для map
Всем привет! Нужна помощь в написании программы. У меня есть вот такая прога и мне нужно каким-то образом поместить вектора в map и...

Обращение к map, который внутри другого map
std::map&lt;int, std::map&lt;std::string, int&gt;&gt; m1; std::map&lt;std::string, int&gt; m2; void main() { m1 = m2; m2 = 7; ...

17
02.03.2018, 17:53

Не по теме:

Потому что ты плохо объяснил, что хочешь. О фильтрации обычно говорят при отображении где-то.

0
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
02.03.2018, 19:25  [ТС]
Виноват, исправлюсь.

Если Вы знаете решение подскажите пожалуйста.
Работает но получился "паровоз"((((
0
02.03.2018, 22:03

Не по теме:

Я же говорю, что задача не ясна.

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.03.2018, 22:24
Лучший ответ Сообщение было отмечено AlexLan73 как решение

Решение

Цитата Сообщение от AlexLan73 Посмотреть сообщение
Подскажите пожалуйста, как можно отфильтровать map только по дате (датам), и подсчитать quantity.
AlexLan73, вообще говоря можно. Но обычно, нельзя. map это само-упорядочиваемый (классное слово) контейнер. Это значит, что с ним ничего нельзя сделать в плане изменений. Конечно вопрос связи ключей и данных - отдельная тема для рассуждений. В том смысле что если связь формальна то данные можно менять как угодно. Но логическая ценность такой карты - ноль. Обычно ключи связаны с данными логически и это значит что писать данные нельзя. Можно удалить элемент и вставить новый.
В Вашем случае имеет смысл делать выборки в отдельный контейнер. Проще всего если диапазон данных ограничивающих выборку это диапазон ключей и принадлежность диапазону определяется тем же предикатом, что и передан для построения мапы. Иначе скорее всего придётся пройти весь контейнер насквозь.
1
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
02.03.2018, 23:27  [ТС]
IGPIGP
Спасибо за ответ. Коротко и емко.
Может Вы подскажете другой способ организации данных.
Данные;
за 5-10 лет, в день от 3 до 10 записей. Каждая запись имеет 20 значений.

Задача отфильтровать по дням - за период, и получить доступ к данным.
Критично к скорости.

С уважением, Александр.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.03.2018, 23:47
Лучший ответ Сообщение было отмечено AlexLan73 как решение

Решение

Цитата Сообщение от AlexLan73 Посмотреть сообщение
Модно ли создать фильтр и видеть только отфильтрованные значения
к примеру только на дату 2018.03.02 или 2018.01.01-2018.03.02
std::map::lower_bound на обе даты, получаете два итератора, просматриваете что там между ними. "Дату" заменить на 2018.03.02:00:00:00.
1
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
02.03.2018, 23:56  [ТС]
Спасибо.))
Если не трудно, как это будет выглядеть.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
03.03.2018, 00:02
Лучший ответ Сообщение было отмечено AlexLan73 как решение

Решение

Под даты сами переделывайте.
C++
1
2
3
4
5
6
7
8
9
int main()
{
    std::map<int,int> myMap={{1,1},{2,2},{3,3},{4,4},{5,5}};
    auto minPos=myMap.lower_bound(3);
    auto maxPos=myMap.lower_bound(7);
    for(auto pos=minPos;pos!=maxPos;++pos)
        std::cout<<pos->second<<std::endl;
    return 0;
}
1
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
03.03.2018, 00:07  [ТС]
Спасибо.))
Сейчас переделаю.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2018, 00:10
AlexLan73, покажите предикат который передан в конструктор мапы или перегрузку для оператора < для структуры sdate_time (не побоюсь этого слова - "ключа"). Если окажется что сравнение - лексографическое и первым элементом является год, то наверное есть решение попроще.
1
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
03.03.2018, 00:21  [ТС]
Вот тайой
Наверно у профи красивее получится)))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        bool operator<(const i_date& val) const
        {
            const int is_g = god > val.god ? 1 :
                god < val.god ? -1 : 0;
 
            const int is_m = mes > val.mes ? 1 :
                mes < val.mes ? -1 : 0;
 
            const int is_d = day > val.day ? 1 :
                day < val.day ? -1 : 0;
 
            return is_g == 1 ? true : is_g == -1 ? false :
                is_m == 1 ? true : is_m == -1 ? false :
                is_d == 1 ? true : false;
        }
Добавлено через 4 минуты
IGPIGP
Я, Вас правильно понял.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2018, 00:29
Цитата Сообщение от AlexLan73 Посмотреть сообщение
Вот тайой
Как для дат - годится, вроде. Я сначала подумал, что Вам по годам надо только.
В этом случае совет Renji, вполне хорош.
http://www.cplusplus.com/refer... wer_bound/

То есть, на определённый запрос Вы можете получить пару итераторов, а затем вывести от и до в отдельный контейнер или поток. И посчитать. Если только считать то count_if можно.
0
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
03.03.2018, 00:35  [ТС]
Почему так "Если только считать то count_if можно."
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2018, 00:45
Цитата Сообщение от AlexLan73 Посмотреть сообщение
Почему так "Если только считать то count_if можно."
Потому, что он не даст набор элементов, а только посчитает их количество.
http://www.cplusplus.com/refer... /count_if/
1
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
03.03.2018, 00:49  [ТС]
Огромное Вам всем спасибо)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2018, 02:01
Цитата Сообщение от AlexLan73 Посмотреть сообщение
Огромное Вам всем спасибо)
Уверен, что я не сообщил Вам чего-то нового, но всё равно, - пожалуйста.
Интересно вот что:
C++
1
map<sdate_time, all_trade> all_trade_;
Дата это отличная штука, конечно. Мы живём в такое время, что каждый кто на сегодня ещё жив, может считать этот день очередным днём рожденья. Каждый день уникален по своему. Это да. И всё же, каждый чемодан связан со своей ручкой гораздо сильнее чем с какой либо датой. С таким же успехом чемоданы можно просто пронумеровать?
Интересно с какими данными связана эта мапа.
И почему не выбрать для их хранения вектор например. Ведь если это хронологическое логирование то мапа не нужна. А если данные поступают в разброс то трудно представить чтобы они были уникальны по датам. Разве что сами данные аккумулируют что-то, и постоянно уточняются (и тут лучше бы сортированный вектор). Не могу представить, что бы это могло быть.
0
2 / 2 / 3
Регистрация: 06.10.2013
Сообщений: 168
05.03.2018, 21:23  [ТС]
Может кому нибудь пригодится.
Задача
1.создать map с ключом по дате/время и данные.
2. в map нужно выделить временной интервал, в внутри которого произвести вычисления с данными.
Получилось такая программа.
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
51
52
    struct date_time   // Ключ map
    {   date_time() = default;
        date_time(const int year, const int month, const int day, const int hour, const int minute)
        {   set(year, month, day, hour, minute); };
        date_time(const int year, const int month, const int day) 
                {set(year, month, day, 0, 0); };
        date_time(const date_time *sourse)
        {   set(sourse->year, sourse->month, sourse->day, sourse->hour, sourse->minute); };
        void set(const int year, const int month, const int day, const int hour, const int minute)
        {   leap(year);
            this->year = year;
            this->month = month;
            this ->day = day;
            this->hour = hour;
            this->minute = minute;
               _is = is();
        }
        void set_hour_min(const int hour, const int min)
        {   this->hour = hour;
            this->minute = min;
        }
        bool operator < (const date_time& val) const      //  для ключа в map
        {   if (year > val.year) return false;
            if (year < val.year) return true;
            if (month > val.month) return false;
            if (month < val.month) return true;
            if (day > val.day) return  false;
            if (day < val.day) return true;
            if (hour > val.hour) return false;
            if (hour < val.hour) return true;
            if (hour > val.hour) return false;
            if (hour < val.hour) return true;
            if (minute < val.minute) return true;
            return false;
        }
        int year = -1;
        int month = -1;
        int day = -1;
        int hour = -1;
        int minute = -1;
        bool _is = false;
    private:
        int days_[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
        void leap(int y)                                                                                              // проверка на високосный год
        {   if ((y % 4 == 0 && y % 100 != 0) || y % 400) days_[1] = 29; }
        int maxday()    {   return days_[month - 1];    }
        bool is()    
        {   return _is = year > 2000 && year < 2050 && month >= 1 && month <= 12
                && day >= 1 && day <= maxday() && hour >= 0 && hour < 24
                && minute >= 0 && minute <= 59;
        }
    };
сам MAP с фильтром
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    typedef my_date_time::date_time datetime;
    template <class T>
    struct mapfiltr_datetime 
    {   ~mapfiltr_datetime(){};
        std::map<datetime, T*> day_trades{};
        typename std::map<datetime, T*> ::iterator min_pos;
        typename std::map<datetime, T*> ::iterator max_pos;
        mapfiltr_datetime() { day_trades.clear(); }
        virtual void calculation_repeat(typename std::map<datetime, T*> ::iterator pos){}
        void add(datetime dt, T* t) {   day_trades.insert(std::pair <datetime, T*>(dt, new T(t)));  }
        int  kol_record(const datetime begin, const datetime end)
        {   if (day_trades.empty() && day_trades.size() == 0)   return 0;
            min_pos = day_trades.lower_bound(begin);
            max_pos = day_trades.upper_bound(end);
            return std::count_if(min_pos, max_pos, [](std::pair < datetime, T*>  p) {return  p.second;});
        }
        void filtr(const datetime *begin, const datetime *end)
        {   const auto kol = kol_record(begin, end);   
            if (kol <= 0) return;
            for (auto pos = min_pos; pos != max_pos; ++pos) 
                calculation_repeat(pos);   // обработка записи
        }
    };
структура данных
C++
1
2
3
4
5
6
7
8
9
struct dan_test
{
    dan_test(float punct1, float punct2): punct1(punct1),  punct2(punct2)   {   }
    dan_test(dan_test* sours)   { punct1 = sours->punct1;   punct2 = sours->punct2; }
    float punct1 = 0.f;
    float punct2 = 0.f;
    float add_punct = 0.f;
    float sum_punct = 0.f;
};
Пример вызова struct mapfiltr_datetime и запуск программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct test_map : mapfiltr_datetime<dan_test>
{   test_map()  {   };
        //[B][U] вызывается  из mapfiltr_datetime[/U][/B]  
    void calculation_repeat(typename std::map<datetime, dan_test*> ::iterator pos) override
    {   add_punct = add_punct + pos->second->punct1;
        sum_punct= sum_punct - pos->second->punct2;
        pos->second->add_punct= add_punct;
        pos->second ->sum_punct= sum_punct;
    }
    void calculation(const datetime *begin, const datetime *end)
    {   add_punct = 0.f;
        sum_punct = 0.f;
        filtr(begin, end);
    }
    date_time dt0;
    float add_punct = 0.f;
    float sum_punct = 0.f;
};
основная часть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#include <memory>
int main()
{   std::shared_ptr<test_map> _test = std::make_shared<test_map>();;
    _test->add(date_time(2018, 3, 1, 0, 0), new dan_test(1, -11));
    _test->add(date_time(2018, 3, 1, 1, 2), new dan_test(22, -212));
    _test->add(date_time(2018, 3, 2, 2, 3), new dan_test(3, -32));
    _test->add(date_time(2018, 3, 4, 10, 20), new dan_test(44, 424));
    _test->add(date_time(2018, 3, 3, 12, 10), new dan_test(55, -552));
    _test->add(date_time(2018, 3, 2, 3, 30), new dan_test(6, 612));
    _test->add(date_time(2018, 3, 5, 15, 40), new dan_test(77, 76));
    auto xx = _test->kol_record(new date_time(2018, 3, 1, 0, 0), new date_time(2018, 3, 7, 0, 0));
    _test->calculation(new date_time(2018, 3, 2, 0, 0), new date_time(2018, 3, 4, 0, 0));
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2018, 21:23
Помогаю со студенческими работами здесь

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

Как вставить элемент и вывести элементы на экран в map<string, map<string,int>> ?
У меня есть map&lt;string, map&lt;string,int&gt;&gt;, в него надо добавить элементы (типа Ivanov potato 200) Использовать именно map&lt;string,...

Как вставить map в map
есть такой map map &lt; INT64 , map &lt;INT64 , map&lt; wArray , int &gt; &gt; &gt; tMenu; как его заполнить? пробовал так ...

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
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