#c #function
#c #функция
Вопрос:
Я пытаюсь вернуть определенный массив из функции, которая при вызове присваивает значение массиву
Функция должна выглядеть примерно так:
int arr[10];
int values[10] = {1,2,3,4,5,6,7,8,9};
for (int i =0; i<10; i )
{
arr[i] = values[i];
}
Как мне перевести этот код в функцию?
использование пространства имен std;
Комментарии:
1. Рассмотрите возможность возврата
std::vector
вместо массивов.2. Используйте
std::array
, а не немые массивы, которые нельзя копировать.
Ответ №1:
Насколько я знаю, вы не должны пытаться возвращать массив из функции… как, когда-либо. Вместо этого я бы передал имена массивов функции и попросил ее обработать содержимое любым способом, который вам нужен. В вашем случае вы просто копируете их, поэтому должно сработать что-то вроде этого:
#include <iostream>
using namespace std;
void copy_array (const int [], int []); //function prototype
int main()
{
//Your arrays
int arr[10];
int values[10] = {1,2,3,4,5,6,7,8,9};
//Function call
copy_array(values, arr);
//Display contents of array
for(int i =0; i<10; i ){
cout << arr[i] << " " ;
}
return 0;
}
//Function definition
void copy_array (const int values[], int arr[]){
for (int i =0; i<10; i ){
arr[i] = values[i];
}
}
Вывод
1 2 3 4 5 6 7 8 9 0
Кроме того, размер вашего массива должен быть постоянной целочисленной переменной.
Комментарии:
1. Чем это отличается от другого ответа, который был дан? В любом случае, комментарии, которые я сделал к этому ответу, применимы и к вашему ответу.
2. Я не заметил другого ответа… Наверное, я слишком долго отвечал на lmao … mb
Ответ №2:
вы, вероятно, не хотите возвращать массивы как никогда, потому что это может означать много бесполезного копирования, что замедляет работу вашей программы, но вы всегда можете написать функцию, которая копирует значения из одного массива в другой
#include <iostream>
void assignarray(int *dest, int *src, size_t size)
{
for (size_t i = 0; i < size; i)
{
dest[i] = src[i];
}
}
int main()
{
int arr[10];
int values[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
assignarray(arr, values, sizeof(values) / sizeof(int));
for (size_t i = 0; i < 10; i )
{
std::cout << values[i] << " ";
}
}
вывод:
1 2 3 4 5 6 7 8 9 10
Комментарии:
1. Ваш комментарий о том, что это «бесполезные копии», не обязательно соответствует действительности для оптимизирующего компилятора. Но массивы все равно не могут быть возвращены, так что это спорный вопрос. Я бы поспорил, что ваш код может быть не быстрее и, возможно, медленнее, чем using
std::array
.2. Результат, который я получил , таков
1 2 3 4 5 6 7 8 9 10
. 4-е число отличается от вашего вывода.3. да, извините, я скопировал неверный вывод из более ранней версии: D @PaulMcKenzie, если вы можете использовать std::array только в том случае, если у вас есть массивы фиксированного размера и вы знаете их время компиляции. если вы используете метод копирования, вы можете изменить его размер, и если вы знаете размер, вы всегда можете скопировать их: D но да, если вы можете использовать std::array, вы должны это сделать
4. Чтобы изменить размер массива, вы бы использовали
std::vector
. Одна вещь, которую вы должны понимать — введение указателей не означает «ускорение кода». Слишком многие все еще думают, что использование указателей превзойдет оптимизатор компилятора. Кроме того, комментарий о возврате массива — даже если массивы не могут быть возвращены, этот базовый комментарий неверен в отношении возврата, замедлит код. Компиляторы используют, а в некоторых случаях и обязаны оптимизировать возвращаемое значение, поэтому все те страхи 20-летней давности о возвращении больших объектов, «замедляющих» программу, по большей части, исчезли.5. И если у вас есть небольшая программа с небольшой функциональностью, зачем вам заключать ее в тяжелый класс std::vector ? — Вот почему я упомянул
std::array
в первый раз. Во-вторых, объем функциональности не имеет ничего общего с использованием вектора или нет. Если функциональность того, что предоставляет vector, создает чистую программу без ошибок, то ее следует использовать.
Ответ №3:
Возвращаемый тип функции не может быть массивом.
Однако array может быть членом класса, а class может быть типом возвращаемого значения функции, поэтому можно вернуть объект класса, который оборачивает массив. В стандартной библиотеке есть шаблон для такой оболочки массива. Он вызывается std::array
.
Тем не менее, возврат массива (заключенного в класс) не обязательно является хорошим дизайном. Иногда лучше позволить вызывающей стороне создать контейнер — и действительно, они могут выбрать тип контейнера, который они хотят использовать, — и передать его в шаблонную функцию для заполнения. Вот пример принятия диапазона:
template<class Range>
void fill(Rangeamp; r) {
assert(std::ranges::distance(r) == 10);
int values[10] = {1,2,3,4,5,6,7,8,9};
int i = 0;
for (autoamp; e : r)
{
e = values[i ];
}
}
// example
int arr[10];
fill(arr);