как передать массив по значению в C ++ - PullRequest
0 голосов
/ 03 мая 2018

у меня есть следующий код

#include <iostream>

using namespace std;

int *sort(int arr[]){
    for(int i =0; i< 1; i++){
        for(int j= 1; j< 5; j++){

            if(arr[i]< arr[j]){
                int temp = arr[i];
                arr[i] =arr[j];
                arr[j] = temp;
            }

        }

    }
    for(int k=0; k<5;k++){
        cout<<arr[k];
    }
return arr;
}

int main(){  
    int arr[5] = {1,2,3,4,5};
    sort(arr);
    for(int m=0; m<5; m++){
        cout<<arr[m];
    }
}

Моя первая проблема заключается в том, как передать массив по значению, чтобы исходный массив не изменился, и, во-вторых, функция my sort не генерирует правильную сортировку. Я хочу отсортировать массив в порядке убывания.

Ответы [ 4 ]

0 голосов
/ 03 мая 2018

Ваш вопрос указывает на то, что может возникнуть некоторая путаница относительно того, как обращаться с указателями в C ++. Если мое предположение неверно, тогда просто пропустите (я предоставлю «мое решение» / исправление в конце этого поста).

Чтобы ответить на ваш первый вопрос: вы не можете передавать массивы в стиле C для каждого значения в C ++, а также для справки. Ваша единственная «опция» будет проходить по указателю, пока не будет достигнуто «\ n», и сохранить содержимое в новом массиве, созданном в вашей функции.

что было бы чем-то вроде

'{
    int arrx[5] = {};

    for(int i = 0; i < 5; i++) 
    {
        arrx[i] = arr[i];
    }
    for (int j = 0; j < 5; j++) // print
    {
        std::cout << arrx[j];
    }
    return 0;
}`

Несколько других вещей об указателях:

int *sort(int arr[]){ -> arr[] passes a pointer to arr(same as *arr)

Указатель указывает на первый элемент в памяти, на который указывает & не имеет наследуемого размера, что означает

sizeof(arr) / sizeof(arr[0])

не будет работать внутри вашей функции сортировки (что может привести к проблемам, если вы точно не знаете, какой длины массив, который вы хотите найти). простым решением было бы передать размер вашего массива по значению / ссылке на вашу функцию. Другим решением было бы перебрать сам массив через что-то вроде

for(;arr != '\n'; arr++)
{
//your code here

Вы можете получить гораздо больше информации об указателях, чем я когда-либо мог бы дать вам, посетив различные учебные сайты. например: https://www.tutorialspoint.com/cplusplus/cpp_pointers.htm

http://www.cplusplus.com/doc/tutorial/pointers/

Но теперь вернемся к исходному вопросу и, надеюсь, ответу на него.

int *sort(int arr[]) {
    for (int i = 0; i< 1; i++) { 

следует исправить на for(int i=0; i< 5-1; i++)

функция сортировки, которую вы пытаетесь реализовать, называется пузырьковой сортировкой. для получения дополнительной информации и как именно работает bubblesort, см. https://de.wikipedia.org/wiki/Bubblesort

        for (int j = 1; j< 5; j++) {

следует исправить на for(int i=0; i< 5-1-i; i++), потому что последние элементы уже на месте.

        if (arr[i]< arr[j]) {

должно быть исправлено на if (arr[j]< arr[j+1]), потому что вы хотите сравнить (например) первый элемент и следующий элемент, чтобы получить его в порядке убывания / возрастания. это делается для каждой пары чисел в вашем массиве.

и наконец:

        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

должно выглядеть примерно так:

        int temp = arr[j+1];
        arr[j+1] = arr[j];
        arr[j] = temp;

обратите внимание, что вы также можете переформатировать его в:

        int temp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = temp; // same output

в качестве примера: если arr [j] = 5 и arr [j + 1] = 6, вы сохраняете значение j + 1 (6) в temp, перезаписываете arr [j + 1] с помощью j (5) и наконец, сохраните 6 в j, чтобы получить нисходящий порядок (надеюсь, я получил это прямо сейчас, но вы понимаете суть)

наконец; как уже правильно отметили другие, вы можете использовать std::swap вместо использования переменных key / temp.

0 голосов
/ 03 мая 2018

Базовый ответ: вы не можете передавать массивы по значению в C ++.

Решение 1: Сделайте копию массива в стиле C перед передачей его в свою функцию и удалите оператор return, так как он не понадобится.

Решение 2: Используйте std::array, который является контейнером, который предоставляет те же функциональные возможности, что и базовый массив, а также как конструктор копирования и операторы копирования.

Другое замечание : STL предоставляет алгоритмы сортировки (std::sort), поэтому в жизни вашего будущего программиста не следует самостоятельно реализовывать алгоритмы сортировки, если только вы не делаете что-то действительно конкретное, где важна производительность.

0 голосов
/ 03 мая 2018

В идиоматический C ++, массив arr из 5 int s объявляется std::array<int, 5> arr; или std::vector<int> arr(5);. Обмен значениями std::swap. Функции должны либо изменять свои параметры и возвращать void, либо изменять копию и возвращать это значение.

Вы также не просматриваете все элементы в вашем внешнем цикле.

#include <array>
#include <iostream>

void sort(std::array<int, 5> & arr){
    for(int i = 0; i < 5; i++){
        for(int j = 1; j < 5; j++){
            if(arr[i] < arr[j]){
                std::swap(arr[i], arr[j]);
            }
        }
    }
}

int main(){  
    std::array<int, 5> arr = {1,2,3,4,5};
    sort(arr);
    for(int m=0; m<5; m++){
        std::cout<<arr[m];
    }
}

Однако самый простой способ сортировки - использовать <algorithm> std::sort, который принимает диапазон в виде двух Iterator параметров

#include <algorithm>
#include <array>
#include <iostream>

int main(){  
    std::array<int, 5> arr = {1,2,3,4,5};
    std::sort(arr.begin(), arr.end(), std::greater<int>{});
    for(int m=0; m<5; m++){
        std::cout<<arr[m];
    }
}
0 голосов
/ 03 мая 2018

1) вы можете использовать функцию c ++ swap вместо временной переменной

swap(arr[i], arr[j]);

2) ваши for петли должны выглядеть следующим образом

for(int i = 0; i < 5; i++) {
    for(int j = i; j < 5; j++) {

Внешний цикл должен выполнять итерацию по всему массиву (от 0 до 4), а внутренний должен выполнять итерацию по «правой стороне» массива, потому что левая сторона уже отсортирована

поэтому мы не можем передать массив по значению

https://stackoverflow.com/a/16137997/6521788 https://stackoverflow.com/a/16137995/6521788

Вы можете просто скопировать значения в новый массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...