Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/48: Рейтинг темы: голосов - 48, средняя оценка - 4.94
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602

Std::map::emplace

09.02.2015, 03:03. Показов 10831. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
То ли я туплю/криво поставил компилятор, то ли это emplace синтаксис кривой, но... Как использовать emplace применительно к map со значениями БЕЗ конструктора копирования/перемещения? Пишу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<map>
struct test
{
    test(int,int){}
    test(const test&)=delete;
    test(test&&)=delete;
    int x,y;
};
 
int main()
{
    std::map<int,test>my_map;
    my_map.emplace(0,0,0);
}
Ругается что "error: no matching function for call to 'std:: pair<const int, test>:: pair(int, int, int)'".
Напишу my_map.emplace(0,test(0,0)); - ну, здесь все понятно - конструкторы перемещения/копирования отсутствуют.
Ладно, дописываю этой заразе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
namespace std
{
template<>
struct pair<const int,::test>
{
    typedef const int first_type;
    typedef test second_type;
    pair(int a,int b,int c):first(a),second(b,c){}
    const int first;
    test second;
};
}
Работает, но костыль же.

Если же emplace жить не может без конструктора перемещения, я честно говоря, не понимаю на кой черт этот emplace нужен и чем он отличается от insert.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2015, 03:03
Ответы с готовыми решениями:

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

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

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

21
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,655
Записей в блоге: 6
09.02.2015, 14:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
Мы уже разобрались что emplace(1,2) конструирует pair через создание временного объекта test. Извините, но "построение на месте" с вызовом перемещающего конструктора для обоих полей объекта, это чистая профанация.
И я и ForEveR, показали вам как конструируются элементы мапа на месте с помощью метода emplace без вызова перемещающего конструктора... Можете сами проверить:
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
#include<map>
#include<iostream>
#include<map>
struct test
{
    test(int) {}
    test(int, int) {}
    test(const test&){
        std::cout << "test(const test&)\n" << std::endl;
    };
    test(test&&){
        std::cout << "test(test&&)\n" << std::endl;
    };
    int x,y;
};
 
int main()
{
    std::map<int,test>my_map;
    my_map.emplace(
      std::piecewise_construct,
      std::forward_as_tuple(10),
      std::forward_as_tuple(3,10)
    );
}
Так что пойду-ка я лучше займусь другими делами.
Ах. Да кстати. Отсутствие конструкторов копирования и перемещение противоречит требованиям STL. Подобные фокусы, к примеру, с контейнером vector уже не прокатят. А причиной всему все те же самые аллокаторы.
Удачи в самостоятельном изучении...
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.02.2015, 14:40  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
И я и ForEveR, показали вам как конструируются элементы мапа на месте с помощью метода emplace без вызова перемещающего конструктора...
Без вызова перемещающего конструктора pair, но с вызовом перемещающего конструктора его полей. Что с практической точки зрения абсолютно тоже самое. Если, конечно, мы про emplace(1,2), а не через piecewise_construct.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.02.2015, 14:40

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

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

Потокобезопасность std::map::end, std::list::end
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

Поиск по std::map
есть вот такой код // ConsoleApplication29.cpp: определяет точку входа для консольного приложения. // #include...

std::map не компилируется
Всем здравствуйте. Возникла проблема при попытке использования std::map в visual studio 2010. при подключении файла &lt;map&gt; и...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru