С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/55: Рейтинг темы: голосов - 55, средняя оценка - 4.53
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499

Emplace в std::map. Как добавить элемент в std::map без копирования?

27.01.2016, 02:07. Показов 10669. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте... есть ли способ не писать так:
C++
1
2
3
4
std::map<int, char> ksa;
ksa.emplace(std::piecewise_construct,
    std::forward_as_tuple(1),
    std::forward_as_tuple('a'));
чтобы добавить элемент без копирования в std::map?

пробовал:
C++
1
2
typedef std::map<int, char> char_map;
typedef std::invoke<&char_map::emplace, 1, 'a'>::type please;
все валится...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.01.2016, 02:07
Ответы с готовыми решениями:

Std::map::emplace
То ли я туплю/криво поставил компилятор, то ли это emplace синтаксис кривой, но... Как использовать emplace применительно к map со...

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

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

21
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
27.01.2016, 02:16
Для начала хотелось бы разобраться,
чем не устраивает способ
C++
1
ksa.emplace(1, 'a') ;
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
27.01.2016, 02:19  [ТС]
омг... что-то я тупанул
вроде ж раньше нельзя было вашим способом добавлять
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
27.01.2016, 02:23
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
#include <iostream>
#include <map>
 
 
 
struct Test
{
    Test(int x): x_(x) { std::cout << "ctor" << std::endl ;}
    Test(const Test& src): x_(src.x_) { std::cout << "cctor" << std::endl ;}
    Test& operator=(const Test& src) { x_ = src.x_ ; std::cout << "ass" << std::endl ; return *this; }
    ~Test() { std::cout << "dtor" << std::endl ;}
    int x_ ;
} ;
 
 
std::ostream& operator<<(std::ostream& stream, const Test& obj)
{
    return stream << obj.x_ ;
}
 
 
int main()
{
    std::map<int, Test> ksa;
    ksa.emplace(1, 10) ;
    ksa.emplace(2, 5) ;
    ksa.emplace(3, 6) ;
    ksa.emplace(4, 7) ;
    for(auto& e: ksa)
        std::cout << e.first << " : " << e.second << std::endl ;
}
http://rextester.com/XGLFD32583

никакого копирования.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
27.01.2016, 03:01  [ТС]
Croessmah, а не подскажете через std::invoke как запилить... интересно даже стало, сам не допер пока
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
27.01.2016, 03:23
Цитата Сообщение от tapochka Посмотреть сообщение
а не подскажете через std::invoke как запилить...
Как будет у меня компилятор, с поддержкой c++17,
так посмотрю, а пока даже не лезу туда
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
27.01.2016, 04:58  [ТС]
походу это принципиально нереально, учитывая, что emplace возвращает черти что

Добавлено через 8 минут
из-за этого и через bind не получится походу
C++
1
std::bind(&char_map::emplace, ksa, 1, 'a')();
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.01.2016, 10:35
tapochka, Интересный вопрос. Но дело точно не в том что возвращает emplace. Вот так работает:
C++
1
2
3
   std::map<int, int> map;
   auto f = std::bind(&std::map<int, int>::emplace<int, int>, std::ref(map), std::placeholders::_1, std::placeholders::_2);
   f(1, 2);
Если же передать прям значения в bind - работать не будет. Тоже самое с vector::emplace_back.

Добавлено через 5 минут
С invoke все попроще:
C++
1
std::invoke(&std::map<int, int>::emplace<int, int>, std::ref(map), 1, 2);
2
27.01.2016, 10:43

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
std::invoke
крутая штука, мы в одном низкоуровневом проекте целую библиотеку для этого тянули, чтоб не зависеть от calling convention. std::invoke похоже решает эту проблему.

0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
27.01.2016, 11:21
Kastaneda, можно подробнее каким образом std::invoke абстрагирует от calling convention?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
27.01.2016, 11:35
gromo, конкретно std::invoke еще не смотрел.
Зачем мы у себя тянули левую библиотеку - у нас генерился ассемблер в рантайме, который потом исполнялся. Целевую платформу не знаем, нужно вызвать ф-цию - как вызвать? Куда аргументы класть? Кто стек почистит? Вот для этого есть готовая обертка в виде библиотеки (забыл как называется). Если std::invoke позволяет делать тоже самое без левой библиотеки, то это круто! Но повторюсь, я не смотрел еще что там внутри, просто кажется, что ее в стандарт добавили не только для того, чтобы вместо f() можно было писать invoke(f), должен быть более глубокий смысл.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
27.01.2016, 12:50
Цитата Сообщение от Kastaneda Посмотреть сообщение
Но повторюсь, я не смотрел еще что там внутри, просто кажется, что ее в стандарт добавили не только для того, чтобы вместо f() можно было писать invoke(f), должен быть более глубокий смысл.
The aim of this proposal is to introduce the function template invoke that provide uniform semantics for invoking all C++ callable types which includes: function pointers, member pointers and functors.
...
template<typename F>
auto deref_fn(F&& f)
{
return [f](auto&&... args) { return *std::invoke(f, std::forward<decltype(args)>(args)...); };
}
Вот собственно и весь смысл. Без invoke пришлось бы использовать sfinae и mem_fn.
2
27.01.2016, 12:51

Не по теме:

Цитата Сообщение от ct0r Посмотреть сообщение
Вот собственно и весь смысл
а, ну тогда не интересно:(

0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
27.01.2016, 22:18  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
std::invoke(&std::map<int, int>::emplace<int, int>, std::ref(map), 1, 2);
ошибка на vs2015

Цитата Сообщение от ForEveR Посмотреть сообщение
Если же передать прям значения в bind - работать не будет
а почему так?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.01.2016, 00:12
tapochka, Не знаю что там с VS, на gcc/clang работает. А почему если передать значения в bind не работает - не знаю.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
28.01.2016, 06:28
Цитата Сообщение от ForEveR Посмотреть сообщение
А почему если передать значения в bind не работает - не знаю.
map же скопируется и emplace будет вызвана для скопированного map'а, а не для оригинального. std::bind() внутри себя хранит переданные аргументы - передашь копии, будут храниться копии, передашь ссылки, будут храниться ссылки.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.01.2016, 08:45
Kastaneda, Не работает не в том плане. Даже если передать с std::ref - ошибка компиляции на вызове полученной функции без аргументов.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
28.01.2016, 08:49
ForEveR, что-то не догоняю о чем речь. Думал об этом
C++
1
2
3
   std::map<int, int> map;
   auto f = std::bind(&std::map<int, int>::emplace<int, int>, std::ref(map), std::placeholders::_1, std::placeholders::_2);
   f(1, 2);
Добавлено через 55 секунд
а, понял, речь об аргументах?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.01.2016, 08:49
Kastaneda, Не совсем. Имелось ввиду, что не будет работать так:
C++
1
2
auto f = std::bind(&std::map<int, int>::emplace<int, int>, std::ref(map), 1, 2);
f();
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
28.01.2016, 09:11
ForEveR, сижу под виндой, студия 13 даже рабочий вариант не компилит. Что-то не могу причину понять, странно. В gcc писал такое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2016, 09:11
Помогаю со студенческими работами здесь

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и перезаписи struct pStruct { int...

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

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

Std::unordered_multimap<std::string, int> map
Приветствую. Как можно получить только &quot;уникальный&quot; ключ в контейнере? std::unordered_multimap&lt;std::string, int&gt; map; ...

Std::vector добавить новый элемент собственного класса без использования конструктора копирования
Всем привет! Есть один класс, который я хочу хранить в std::vector. Создать массив, с типом своего класса, грубо говоря. Естественно,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru