Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972

Методы заполнения контейнера

09.03.2015, 12:50. Показов 2702. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чем emplace_back() отличается от push_back()? И что из них лучше?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2015, 12:50
Ответы с готовыми решениями:

Объясните код заполнения контейнера map
1) помогите разобраться в коде, вот отрывок: for(i=0; i<m; i++) { mymap.insert( make_pair((y * powmod(a, i, p) ) % p, i) ); ...

Из каждого элемента контейнера map вычесть среднее арифметическое контейнера
Контейнер map, тип элементов Int 3.Из каждого элемента вычесть среднее арифметическое контейнера

Алгоритмы и методы контейнера
Встречаются алгоритмы из класса QtAlgoritms, которые дублируют собственные методы контейнера, а для чего? Добавлено через 3 минуты ...

18
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
09.03.2015, 13:02
Тут и тут подымается данный вопрос. Но, если вкратце, то, судя по всему, разница в том, что emplace_back вызывает конструктор копирования. Это означает, что добавление одного и того же экземпляра несколько раз при помощи emplace_back, на самом деле добавит несколько копий данного экземпляра.
2
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
09.03.2015, 15:17  [ТС]
Цитата Сообщение от НеСказочник Посмотреть сообщение
emplace_back вызывает конструктор копирования
а не перемещения??

Добавлено через 9 минут
C++
1
2
3
4
std::vector<std::string> vec;
vec.emplace_back(std::string("Hello")); // moves
std::string s;
vec.emplace_back(s); //copies
а вот если бы s дали какое-то значение, то она бы не стала от этого rvalue?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
09.03.2015, 15:20
Цитата Сообщение от mat_for_c Посмотреть сообщение
Чем emplace_back() отличается от push_back()? И что из них лучше?
http://habrahabr.ru/post/242639/
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
09.03.2015, 16:24
emplace_back конструирует элемент "на месте", заранее выделенном под него, обычно через placement new, поэтому никаких копирований элемента не происходит.
Цитата Сообщение от mat_for_c Посмотреть сообщение
И что из них лучше?
Если есть возможность использовать emplace_back - используй.
1
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
09.03.2015, 21:12  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Если есть возможность использовать emplace_back - используй
C++
1
2
3
4
5
vector<int> v;
for(i = 0; i < N; i+=2)
   v.emplace_back(i); 
   // или лучше push_back()
   // или нет разницы?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
10.03.2015, 12:04
В данном примере нет смысла использовать emplace_back.
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
10.03.2015, 12:08
Цитата Сообщение от castaway Посмотреть сообщение
В данном примере нет смысла использовать emplace_back.
Цитата Сообщение от mat_for_c Посмотреть сообщение
C++
1
2
3
4
5
vector<int> v;
for(i = 0; i < N; i+=2)
 v.emplace_back(i); 
 // или лучше push_back()
 // или нет разницы?
В засисимости от того какой тип имеет переменная i. Может быть это экземпляр класса, в котром переопределены операторы меньше и +=. Тогда для экземпляра класса это может иметь смысл.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
10.03.2015, 14:08
В данном случае она имеет тип int, поэтому смысла нет.
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
21.03.2015, 23:47  [ТС]
есть структура
C++
1
2
3
4
5
struct freq {
   double val;
   int cnt_1;
   int cnt_2;
}
сделал вектор этих структур. а как мне теперь правильно вызвать emplace_back??
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.03.2015, 23:58
Цитата Сообщение от mat_for_c Посмотреть сообщение
Чем emplace_back() отличается от push_back()? И что из них лучше?
первое сразу конструирует объект на месте с нужными аргументами.
(нет никаких копирований, или промежуточных копий)

второе - порождает объект, как копию объекта переданного в аргумент.

очевидно, что первый способ в общем случае работает быстрее.

http://rextester.com/VKKKD5000

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
//Title of this code
//g++  4.8.2
 
#include <iostream>
#include <vector>
 
 
struct freq {
    
    freq(const double v = 0.0, const int c1 = 0, const int c2 = 0)
        :val(v)
        ,cnt_1(c1)
        ,cnt_2(c2)
    { std::cout<<"ctor\n"; }
    
    
    freq(const freq& s)
        :val(s.val)
        ,cnt_1(s.cnt_1)
        ,cnt_2(s.cnt_2)
   { std::cout<<"copy\n"; }        
    
    
    freq(const freq&& s)
        :val(s.val)
        ,cnt_1(s.cnt_1)
        ,cnt_2(s.cnt_2)
   { std::cout<<"move\n"; }        
    
    
   double val;
   int cnt_1;
   int cnt_2;
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::vector<freq> vec;
    vec.reserve(256);
    
    std::cout << "----- embplace_bak----\n";
    std::cout << "конструируем объект сразу же на месте:\n";
    vec.emplace_back( 1.5, 10, 33 );
 
    std::cout << "----- push_back----\n";
    std::cout << "создаем объект, как копию объекта переданного в аргументе:\n";
   
    vec.push_back( {1.5, 10, 33} );
    
}
1
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
22.03.2015, 00:27  [ТС]
хмм... пишу vec.emplace_back( в подсказке появляется 2 метода : && _myVal и && freq. однако, пишу дальше (item, 0, 0) - подчеркивает первый 0 и говорит, что много параметров. или нужно только числа передавать?
походу да. item тут является lvalue. обидно... эхх

Добавлено через 10 минут
а если делать через push_back(), то подчеркивает { и требует выражение
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.03.2015, 00:30
Цитата Сообщение от mat_for_c Посмотреть сообщение
хмм... пишу vec.emplace_back( в подсказке появляется 2 метода : && _myVal и && freq. однако, пишу дальше (item, 0, 0) - подчеркивает первый 0 и говорит, что много параметров. или нужно только числа передавать?
В качестве аргументов для ebmplace_back выступают значения,
которые принимают конструкторы вашего класса.

я же привел вам рабочий пример выше.

здесь структура может построиться с тремя аргументами:
C++
1
freq(const double v = 0.0, const int c1 = 0, const int c2 = 0)
значит в emplace_back можно указать их:
C++
1
vec.emplace_back( 1.5, 10, 33 );
Цитата Сообщение от mat_for_c Посмотреть сообщение
походу да. item тут является lvalue. обидно... эхх
не спешите делать ложные выводы,
и обижаться раньше времени.
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
22.03.2015, 00:31  [ТС]
походу компилятор не поддерживает эти штуки. а для с++98 как-нибудь сконструировать структуру для вставки без определения дополнительной переменной возможно?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.03.2015, 00:33
Цитата Сообщение от mat_for_c Посмотреть сообщение
а если делать через push_back(), то подчеркивает { и требует выражение
возможно у вас старенький компилятор,
который не поддерживает с++11 в должной мере.

Добавлено через 1 минуту
Цитата Сообщение от mat_for_c Посмотреть сообщение
а для с++98 как-нибудь сконструировать структуру для вставки без определения дополнительной переменной возможно?
можно пушбакать временные объекты и надеяться, что для релизной сборки компилятор их оптимизирует.
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
22.03.2015, 00:35  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
возможно у вас старенький компилятор,
а более новый прикрутить можно?
0
 Аватар для Zazy
47 / 47 / 23
Регистрация: 14.04.2013
Сообщений: 188
22.03.2015, 04:22
mat_for_c, а конструктор у вас для вашей структуры определен ?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
22.03.2015, 10:56  [ТС]
да, определен. и даже 3 разных.

Добавлено через 2 минуты
да ладно уже. сделал через push_back(freq(item, 0, 0)); просто не хотелось создавать временный объект и перемещать его потом, но придется. хотя зачем тогда emplace_back() воткнули, не понятно.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
22.03.2015, 11:15
Цитата Сообщение от mat_for_c Посмотреть сообщение
а более новый прикрутить можно?
Можно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.03.2015, 11:15
Помогаю со студенческими работами здесь

Создать класс Students и методы для заполнения,вывода по номеру группы и балу
В классах только учюсь и не понимаю почему метод не выводит нужную информацию using System; using System.Collections.Generic; using...

Содержимое внутреннего контейнера увеличивает размер внешнего контейнера
есть во внутреннем контейнере фотка, которая достаточно велика, ее стиль не представляется возможности поменять, так как это изображение...

Ajax. Задача заменить содержимое контейнера на содержимое того же контейнера из ответа сервера
Привет всем! Есть обращение Ajax $('#price_button').click(function () { $.ajax({ type: 'GET', url: '', success:...

Необходимо создать форму для заполнения создания и заполнения таблицы
Всем доброго времени суток. Суть такова, Создана база данных с несколькими таблицами, в них присутсвуют данные с наименованием товара...

Написать программу заполнения двумерного массива A по схеме, результаты заполнения выдать на экран и в файл
помогите, пожалуйста, написать программу заполнения двумерного массива A по схеме. Результаты заполнения выдать на экран и в файл. ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru