Я работаю над проблемой, в которой я должен вернуть вектор типа. Я знаю, что размер вектора будет ровно два. Есть ли способ вернуть свои значения в векторной форме, не создавая новую векторную переменную и не возвращая ее?
Я пробовал следующий метод, но он не работал. А также фигурные скобки и прямые скобки.
vector<int> foo()
{
return <1,2>;
}
Вы также можете рассмотреть std::pair
или std::tuple
здесь.
Если я думаю, что вы спрашиваете, как вернуть вектор без создания переменной, то вы хотите return {element_1, element_2};
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;
(т. е. создать именованный вектор, явно настроить его элементы и вернуть его) .
Вы возвращаете значение, которое по определению предполагает копирование.
Есть ли способ вернуть свои значения в векторной форме, не создавая новую векторную переменную и не возвращая ее?
Вы уже возвращаете значение, которое по определению включает копию. Если вы хотите избежать копирования, вы можете попробовать вернуться по ссылке.
Теперь, начиная с C++11, мы должны заменить угловые скобки <>
фигурными скобками {}
, как показано ниже:
//vvvvvvvvvvv------------------>You're returning by value!
vector<int> foo()
{
//---------vvvvv------------->changed <> to {}
return {1,2};
}
«Что по определению предполагает копию». Ну не совсем, да? Эта конкретная копия некоторое время была кандидатом на исключение, и, начиная с C++17, ее необходимо исключить.
@NathanPierson Хотя существует обязательное исключение копирования из C++ 17, оно по-прежнему подпадает под категорию «инициализация копирования». До C++17 выполнение оптимизации зависело от компилятора. Кроме того, прочитав вопрос ОП, кажется, что он не использует современный С++ (начиная с С++ 11 и далее), поэтому я ответил, помня об этом (С++ 11/С++ 14). Также обратите внимание, что технически в С++ 17 нет копии, которую можно исключить!
Если вы используете С++ 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
Это говорит о том, что вы пробовали что-то случайным образом, а это очень сложный способ изучения C++. Всегда держите ссылку под рукой. Попробуйте создать еще один
std::vector
, если это то, что вы возвращаете. C++ не может и не будет читать ваши мысли.