2015-10-15 5 views
0

Массив ссылки не разрешен. Я знаю, что на C++ это незаконно. Но есть ли другой способ сделать это? Я уверен, что есть, но я не могу понять это.Функция сортировки пузырьков в C++

#include <iostream> 
using namespace std; 

#define UBound(n) sizeof(n)/sizeof(n[0]); 

void SortArray(int & Arr[]) { 
    int ArrayLength; 
    ArrayLength = UBound(Arr); 
    int Min, Temp; 
    for (int i = 0; i = ArrayLength; i++) { 
     for (int j = 0; j = ArrayLength; j++) { 
      if (Arr[i+1] < Arr[i]){ 
       Temp = Arr[i+1]; 
       Arr[i+1] = Arr[i]; 
       Arr[i] = Temp; 
       } 
     } 
    } 
} 
void main() { 
    int numArray[9] = { 9, 7, 6, 8, 4, 5, 3, 2, 1 }; 
    SortArray(numArray); 
} 

Final Функция:

template < size_t I > 
    void SortArray(int(&Arr)[I]) { 
     int Min, Temp; 
     for (int i = 0; i < I - 1; i++) { 
      for (int j = 0; j < I - 1; j++) { 
       if (Arr[j+1] < Arr[j]){ 
        Temp = Arr[j+1]; 
        Arr[j+1] = Arr[j]; 
        Arr[j] = Temp; 
       } 
      } 
     } 
    } 

Спасибо всем за ваши ответы.

+0

Почему вы не используете void SortArray (int * Arr)? – Osmani

+0

Другой способ сделать * what *? В чем проблема, которую вы пытаетесь решить? Неясно, как массив ссылок связан с кодом, который вы показываете. – user2079303

+1

'main' должен возвращать' int' в C++. – user2079303

ответ

1

Существует, но это не обязательно тот, который вы должны использовать:

template < size_t I > 
void SortArray(int (&Arr)[I]) {} 

Теперь вы сможете использовать I и sizeof Arr сообщит, как если бы он был на локальной переменной стеке функции в ,

Причина, по которой вы, вероятно, не хотите этого делать, состоит в том, что каждый массив размеров создаст новую копию функции. Может привести к массивному раздуванию.

Но я использовал эту технику для создания типа строки constexpr.

+1

Не переоценивайте раздувание кода. Обычно это намного меньше, чем думают люди :) – SergeyA

+0

«Причина, по которой вы, вероятно, не хотите этого делать, состоит в том, что каждый массив размеров создаст новую копию функции. Может привести к массивному раздуванию». У вас есть какое-то решение? Я просто хочу чистый, оптимизированный код. Этот шаблон работает отлично, но «может привести к массивному раздуванию». –

+1

@AliPadida - Нет. В действительности нет возможности использовать итераторы или параметры указателя/размера. Скорее всего, это будет так же оптимизировано, как и скорость. –

2

Вы можете сделать это с помощью шаблона функции (и ссылка на массив, а не массив ссылок (обратите внимание на скобки)):

template<size_t ArrayLength> 
void SortArray(int (&Arr)[ArrayLength]) { 
    ... 
} 
2

Ваш код имеет несколько вопросов. Позвольте мне перечислить их

  • using namespace std; - НИКОГДА не выполняйте это.
  • #define UBound - Прежде всего, вам не нужен этот макрос. Во-вторых, это определение ошибочно.
  • SortArray пытается получить массив ссылок. Он должен быть либо template <size_t N> void SortArray(int (&Arr)[N]) - получение ссылки на массив; или void SortArray(int Arr[], size_t len)
+0

Так почему бы не «использовать пространство имен std;»? –

+1

@AliPadida Я полагаю, ваш учитель сказал вам сделать это, и в классе это возможно. В основном это позволяет использовать все имена в пределах определенного пространства имен без их квалификации, поэтому 'cout' вместо' std :: cout'. Однако, в общем, это связано с возможными конфликтами имен (предположим, что у вас есть два пространства имен, которые имеют одно и то же имя внутри: если вы используете 'using' на обоих из них, ваш код не будет компилироваться, если он использует один из них) , Для получения дополнительной информации см. Http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – szczurcio

+0

Имеет смысл, спасибо, я постараюсь избежать этого. –

0

Вы можете использовать reference_wrapper для имитации ссылок. В этом примере, взятом из http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper, показано, как использовать его для доступа к контейнеру с несколькими индексами. Я предполагаю, что это то, что вы хотите, чтобы ваша функция сортировки выполняла: сортировать ссылки на элементы в другом контейнере.

#include <algorithm> 
#include <list> 
#include <vector> 
#include <iostream> 
#include <numeric> 
#include <random> 
#include <functional> 

int main() 
{ 
    std::list<int> l(10); 
    std::iota(l.begin(), l.end(), -4); 

    std::vector<std::reference_wrapper<int>> v(l.begin(), l.end()); 
    // can't use shuffle on a list (requires random access), but can use it on a vector 
    std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()}); 
} 
+0

Мне это немного сложно. Просто новичок здесь. Благодарю. –

Смежные вопросы