Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Возврат контейнера STL из функции

19.12.2016, 21:13. Показов 5600. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно вернуть STL контейнер из функции НЕ ПО ЗНАЧЕНИЮ?
C++
1
2
3
4
std :: map<std :: string, BTSComponent*> BTSObject :: getComponents() const
{
    return std :: move( _components );
}
Так?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2016, 21:13
Ответы с готовыми решениями:

Из STL контейнера
Из STL контейнера создать 3-х мерный массив и класс который содержит этот 3-х мерный массив и вывод координат(пользователь вводит...

Выбор контейнера в STL
Здраствуйте! Нужно выбрать к этой задаче контейнер STL, который более выгодно подойдет, кроме вектора. Я думаю, что deque или map Помогите...

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

47
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
19.12.2016, 21:16
Цитата Сообщение от Bretbas Посмотреть сообщение
Как правильно вернуть STL контейнер из функции НЕ ПО ЗНАЧЕНИЮ?
Правильно не пытаться оптимизировать то, что успешно оптимизирует компилятор.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
19.12.2016, 21:21  [ТС]
S_el, а если не оптимизирует? Всегда ли нужно надеяться на компилятор?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.12.2016, 21:31
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Цитата Сообщение от Bretbas Посмотреть сообщение
Как правильно вернуть STL контейнер из функции НЕ ПО ЗНАЧЕНИЮ?
C++
1
2
3
4
const std::map<std::string, SomeComponent>& SomeClass::getComponents() const
{
    return components;
}
П.С. Имена переменных, начинающиеся с нижнего подчёркивания, зарезервированы для компилятора, поэтому Ваш код - UB.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
19.12.2016, 21:35  [ТС]
GbaLog-,
Цитата Сообщение от GbaLog- Посмотреть сообщение
П.С. Имена переменных, начинающиеся с нижнего подчёркивания, зарезервированы для компилятора, поэтому Ваш код - UB.
Читал где-то "Стиль C++", там было написано, что лучше частные члены класса начинать с подчеркивания...
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.12.2016, 21:37
Цитата Сообщение от Bretbas Посмотреть сообщение
там было написано
Функция принимает любое количество строк а затем складывает их
Тут даже постом ниже скинули из стандарта кусок.
0
 Аватар для John999
230 / 113 / 79
Регистрация: 17.10.2016
Сообщений: 312
19.12.2016, 21:41
GbaLog-, всё-таки это никак не UB.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
is reserved to the implementation for use as a name in
the global namespace.
зарезервировано для нужд языка, а не компилятора. Всё STL начинается с подчеркивания .
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.12.2016, 21:43
Цитата Сообщение от John999 Посмотреть сообщение
для нужд языка, а не компилятора.
Ну моя оговорка, да.

Добавлено через 22 секунды
Цитата Сообщение от John999 Посмотреть сообщение
всё-таки это никак не UB.
Займёте чужое имя - будет UB.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.12.2016, 21:43
Следует почитать про RVO и NRVO.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
19.12.2016, 22:00
Цитата Сообщение от Bretbas Посмотреть сообщение
а если не оптимизирует? Всегда ли нужно надеяться на компилятор?
Вы хорошо разбираетесь в процессе оптимизации кода компилятором?

Цитата Сообщение от GbaLog- Посмотреть сообщение
Займёте чужое имя - будет UB.
Оно не будет занято в данном случае. Позволю себе привести цитату из стандарта еще раз:
2.10.3:
In addition, some identifiers are reserved for use by C++ implementations and shall not be used otherwise; no diagnostic is required.
(3.1) — Each identifier that contains a double underscore __ or begins with an underscore followed by an uppercase letter is reserved to the implementation for any use.

(3.2) — Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
Локальные переменные и члены класса НЕ находятся в глобальном пространстве имен, поэтому можно смело их использовать(если, конечно, не нарушать (3.1), чего в коде ТС нету).
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
20.12.2016, 08:11  [ТС]
S_el,
Цитата Сообщение от S_el Посмотреть сообщение
Вы хорошо разбираетесь в процессе оптимизации кода компилятором?
Я это написал написал не из за своих убеждений, а потому, что читал про то, что компилятор может вернуть временный объект из функции за счет перемещения, чтобы не производить копирования. Но не всегда нужно расчитывать на компилятор. Где читал, я уже не смогу вспомнить, помоему у Бьерна Страуструпа
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
20.12.2016, 09:53
Цитата Сообщение от S_el Посмотреть сообщение
Оно не будет занято в данном случае.
Ну, я понимаю, что в данном случае оно занято не будет. Просто John999 сказал это так, как будто вообще нет тут UB никакого в этом правиле. А я ему сказал, когда будет UB.
Цитата Сообщение от S_el Посмотреть сообщение
Позволю себе привести цитату из стандарта
Я вообще английский плохо знаю, лучше б перевели.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
20.12.2016, 09:59
Bretbas, а как же Вы в константной функции-члене перемещаете внутренности?
Да и предполагает ли getComponents очистку собственных данных?
Может лучше вернуть константную ссылку на потроха?
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
20.12.2016, 10:14
Цитата Сообщение от Croessmah Посмотреть сообщение
Bretbas, а как же Вы в константной функции-члене перемещаете внутренности?
Тема вообще забавная! Все участники обсуждения сошлись на том, что из функции-члена класса возвращается временный объект, одновременно являющийся членом класса!
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.12.2016, 10:29
Цитата Сообщение от Mr.X Посмотреть сообщение
Все участники обсуждения сошлись на том
Не все
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
20.12.2016, 10:45
Добавлено через 2 минуты
Цитата Сообщение от MrGluck Посмотреть сообщение
Не все
Как это?
Цитата Сообщение от MrGluck Посмотреть сообщение
RVO и NRVO
это же тоже про временные объекты.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.12.2016, 10:53
Цитата Сообщение от Mr.X Посмотреть сообщение
это же тоже про временные объекты.
Это скорее про то, что временные объекты всё же не создаются.
Наверное, мы об одном и том же говорим. Вы - про то, что затрагивается тема временных объектов, я - про то, что временные объекты не создаются.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
20.12.2016, 11:28
Цитата Сообщение от MrGluck Посмотреть сообщение
Это скорее про то, что временные объекты всё же не создаются.
Наверное, мы об одном и том же говорим. Вы - про то, что затрагивается тема временных объектов, я - про то, что временные объекты не создаются.
Ну, в примере автора в функции ничего не создается, а она возвращает уже существующий объект члена класса.
Поэтому не очень понятно что обсуждали обсуждатели вместо того, чтобы посоветовать автору таки выучить что такое ссылки.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.12.2016, 11:40
Цитата Сообщение от Mr.X Посмотреть сообщение
в примере автора в функции ничего не создается, а она возвращает уже существующий объект члена класса.
Я согласен. Не буду юлить, признаюсь что вначале понял задание неверно исходя из названия темы и не заметил, что у нас функция (мне не удобно читать код, отформатированный подобным образом).
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
20.12.2016, 12:05
Аналогично, ответил не посмотрев на код.

Цитата Сообщение от GbaLog- Посмотреть сообщение
Я вообще английский плохо знаю, лучше б перевели.
Я тоже не эксперт в английском, но попробую:

В дополнении, некоторые идентификаторы зарезервированы для реализаций C++ и не должны быть использованы в других случаях;никакой диагностики не требуется.

(3.1) — Каждый идентификатор содержащий двойное нижнее подчеркивание или начинающийся с нижнего подчеркивания за которым следует заглавная буква зарезервированы реализацией для любого использования

(3.2) — Каждый идентификатор, начинающийся с нижнего подчеркивания зарезервирован реализацией для использования как имя в глобальном пространстве имен.
Bretbas, все правильно, пока не сможете считать себя достаточно хорошо разбирающимся в вопросе оптимизации или нет оснований полагать, что ваша оптимизация лучше - полагайтесь на компилятор.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2016, 12:05
Помогаю со студенческими работами здесь

Обработка STL контейнера vector
Текст дан в виде вектора. Отсортировать элементы этого вектора и превратить на два списка так, чтобы в первом были только те элементы,...

Адаптация контейнера под STL
Учу C++, на данный момент было задание: реализовать односвязный список. Пока что реализовано не все, но возник такой вопрос: &quot;Почему...

Алгоритм выбора контейнера STL
Привет. Существует ли некая таблица по таким контейнерам с кратким описанием плюсов и минусов каждого по сравнению с другими? И в обще...

Использование контейнера string из библиотеки STL
Дан массив слов. Сформировать новое слово из символов слов массива, стоящих после последнего символа ‘*’ в слове. Сформировать предложение...

Реализация примитивного STL совместимого контейнера
Как то застрял на этом. Как правильно объявить все typedef для итератора? Нужен минимальный набросок такого контейнера.template&lt;typename...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru