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

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

Войти
Регистрация
Восстановить пароль
 
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
#1

bind + map - C++

14.01.2014, 12:15. Просмотров 405. Ответов 6
Метки нет (Все метки)

Вопрос, почему это не работает? Вроде же все правильно вызывается.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
   using map_t = std::map<std::string, int>;
   map_t map { {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15} };
 
   auto f = std::bind(&map_t::find, &map, std::placeholders::_1);
   f("A");
 
   return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2014, 12:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос bind + map (C++):

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

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

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

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

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

std::bind - C++
Можно ли, и если да, то как с помощью этой функции сделать следующее: auto var=std::bind(&amp;f, &quot;arg&quot;); //... //... //тут надо из...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
14.01.2014, 12:56 #2
DiffEreD, потому что метод find перегружен, bind не будет выбирать одну из перегрузок сам:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string>
#include <map>
#include <functional>
 
 
int main()
{
   using map_t = std::map<std::string, int>;
   map_t map { {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15} };
 
   using map_find_t = map_t::const_iterator (map_t::*)(map_t::key_type const&) const;
 
   auto f = std::bind(static_cast<map_find_t>(&map_t::find), &map, std::placeholders::_1);
   f("A");
 
   return 0;
}
http://ideone.com/aAv1py
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.01.2014, 13:09  [ТС] #3
Ну и дела.
А как понять эту запись (map_t::*), - это типа указатель на безимянную ф-цию?
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
14.01.2014, 13:27 #4
DiffEreD, Указатель на член класса.
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
14.01.2014, 13:34 #5
DiffEreD, можешь написать функтор с нужными перегрузками operator () для поиска в мапе, если так не охота с кастами возиться.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
14.01.2014, 13:58  [ТС] #6
gray_fox, идею понял так:
C++
1
2
3
4
5
struct map_find_t
{
   map_t::const_iterator operator ()(map_t::key_type const&) const;
   map_t::iterator operator ()(map_t::key_type const&);
};
Но как это потом вызывать в bind?
gray_fox
What a waste!
1511 / 1214 / 69
Регистрация: 21.04.2012
Сообщений: 2,550
Завершенные тесты: 3
14.01.2014, 14:24 #7
DiffEreD, я думал о таком:
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
#include <iostream>
#include <string>
#include <map>
#include <functional>
     
     
struct assoc_find_type {
     
   template<typename AssocContainer>
   typename AssocContainer::iterator
   operator ()(AssocContainer & container, typename AssocContainer::key_type const& key) const {
      return container.find(key);
   }
     
   template<typename AssocContainer>
   typename AssocContainer::const_iterator
   operator ()(AssocContainer const& container, typename AssocContainer::key_type const& key) const {
      return container.find(key);
   }
};
     
constexpr assoc_find_type assoc_find;
     
     
int main()
{
    using map_t = std::map<std::string, int>;
    map_t map { {"A", 10}, {"B", 11}, {"C", 12}, {"D", 13}, {"E", 14}, {"F", 15} };
     
    auto f = std::bind(assoc_find, std::ref(map), std::placeholders::_1);
    f("A")->second = 42;
     
    auto u = std::bind(assoc_find, std::cref(map), std::placeholders::_1);
    std::cout << u("A")->second << std::endl;
     
    return 0;
}
http://ideone.com/mM7yDg

Добавлено через 20 минут

Не по теме:

можно ещё и такое замутить: http://ideone.com/Y2m0cO чего только в голову не взбредёт

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 14:24
Привет! Вот еще темы с ответами:

Адаптер функции bind() - C++
Читаю у Липпмана про адаптер bind, ...какие-то знакоместа. Компилятор на них ругается, я тоже. Вывести тип на создаваемый объект он тоже...

Перегруженные функции и bind - C++
Привет всем! В классе QPushButton есть две версии функции 1. void setGeometry(int x, int y, int w, int h) 2....

Bind + string::front - C++
Почему я не могу это забиндить ?:#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;functional&gt;...

Где применяется bind - C++
Можете пожалуйста привести пример, где boost::bind (или сейчас уже std::bind) необходим и без него не обойтись. Просто, понимаю как...


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

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

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