Как элегантно вернуть определенные векторные элементы в С++

Я работаю над проблемой, в которой я должен вернуть вектор типа. Я знаю, что размер вектора будет ровно два. Есть ли способ вернуть свои значения в векторной форме, не создавая новую векторную переменную и не возвращая ее?

Я пробовал следующий метод, но он не работал. А также фигурные скобки и прямые скобки.

vector<int> foo()
{
    return <1,2>;
}

Это говорит о том, что вы пробовали что-то случайным образом, а это очень сложный способ изучения C++. Всегда держите ссылку под рукой. Попробуйте создать еще один std::vector, если это то, что вы возвращаете. C++ не может и не будет читать ваши мысли.

tadman 31.01.2023 04:37

Вы также можете рассмотреть std::pair или std::tuple здесь.

tadman 31.01.2023 04:38

Если я думаю, что вы спрашиваете, как вернуть вектор без создания переменной, то вы хотите return {element_1, element_2};

NathanOliver 31.01.2023 04:43
return <1,2> недопустимый синтаксис. При использовании C++11 и более поздних версий return {1,2} будет работать, но не будет работать при сборке для стандарта C++ до C++11. До C++11 было невозможно создать и инициализировать 2-элементный std::vector только одним оператором — вам нужно будет сделать что-то вроде std::vector<int> temp; temp.push_back(1); temp.push_back(2); return temp; (т. е. создать именованный вектор, явно настроить его элементы и вернуть его) .
Peter 31.01.2023 04:53

Вы возвращаете значение, которое по определению предполагает копирование.

Jason Liam 31.01.2023 05:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Есть ли способ вернуть свои значения в векторной форме, не создавая новую векторную переменную и не возвращая ее?

Вы уже возвращаете значение, которое по определению включает копию. Если вы хотите избежать копирования, вы можете попробовать вернуться по ссылке.


Теперь, начиная с C++11, мы должны заменить угловые скобки <> фигурными скобками {}, как показано ниже:

//vvvvvvvvvvv------------------>You're returning by value!
  vector<int> foo()
  {
//---------vvvvv------------->changed <> to {}
    return {1,2};
  }

«Что по определению предполагает копию». Ну не совсем, да? Эта конкретная копия некоторое время была кандидатом на исключение, и, начиная с C++17, ее необходимо исключить.

Nathan Pierson 31.01.2023 06:00

@NathanPierson Хотя существует обязательное исключение копирования из C++ 17, оно по-прежнему подпадает под категорию «инициализация копирования». До C++17 выполнение оптимизации зависело от компилятора. Кроме того, прочитав вопрос ОП, кажется, что он не использует современный С++ (начиная с С++ 11 и далее), поэтому я ответил, помня об этом (С++ 11/С++ 14). Также обратите внимание, что технически в С++ 17 нет копии, которую можно исключить!

Jason Liam 31.01.2023 07:18
Ответ принят как подходящий

Если вы используете С++ 11 или более позднюю версию, просто напишите:

vector<int> foo()
{
    return {1,2};
}

{1, 2} будет выведен как initializer_list, и он не вызовет копирование, так как у нас есть 'Copy elision'. Поскольку у него нет имени, которое также называется «Оптимизация возвращаемого значения».

Вы можете увидеть в: https://en.cppreference.com/w/cpp/language/copy_elisionhttps://en.cppreference.com/w/cpp/utility/initializer_list

Другие вопросы по теме