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

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

27.01.2016, 02:07. Показов 10765. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru