C++ C+中的气泡排序函数+;

C++ C+中的气泡排序函数+;,c++,bubble-sort,C++,Bubble Sort,不允许引用的数组。我知道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; f

不允许引用的数组。我知道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);
} 
#包括
使用名称空间std;
#定义UBound(n)sizeof(n)/sizeof(n[0]);
无效排序(int&Arr[]){
内部排列长度;
排列长度=UBound(Arr);
最低温度;
for(int i=0;i=ArrayLength;i++){
对于(int j=0;j=ArrayLength;j++){
if(Arr[i+1]

最终功能:

 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;
                }
            }
        } 
    } 
模板
无效排序(整数(&Arr)[I]){
最低温度;
对于(int i=0;i

谢谢大家的回答。

您可以使用函数模板(以及对数组的引用,而不是引用数组(请注意参数)):

模板
无效排序(整数(&Arr)[排列长度]){
...
}

您可以使用函数模板(以及对数组的引用,而不是引用数组(请注意参数)):

模板
无效排序(整数(&Arr)[排列长度]){
...
}

您的代码存在多个问题。让我把它们列出来

  • 使用名称空间std--永远不要这样做
  • #定义UBound
    ——首先,您永远不需要这个宏。其次,这个定义是错误的
  • SortArray正在尝试接收引用数组。它应该是
    模板void SortArray(int(&Arr)[N])
    ——接收对数组的引用;或
    void SortArray(内部阵列[],大小长度)

您的代码存在多个问题。让我把它们列出来

  • 使用名称空间std--永远不要这样做
  • #定义UBound
    ——首先,您永远不需要这个宏。其次,这个定义是错误的
  • SortArray正在尝试接收引用数组。它应该是
    模板void SortArray(int(&Arr)[N])
    ——接收对数组的引用;或
    void SortArray(内部阵列[],大小长度)

有,但不一定要使用:

template < size_t I >
void SortArray(int (&Arr)[I]) {}
模板
void SortArray(int(&Arr)[I]){
现在,您可以使用
I
,并且
sizeof Arr
将像在函数的局部变量堆栈上一样进行报告


您可能不想这样做的原因是,每个大小的数组都将创建函数的新副本。可能会导致严重的肿胀


但是我使用了这种技术来创建一个constexpr字符串类型。

有,但不一定是您应该使用的类型:

template < size_t I >
void SortArray(int (&Arr)[I]) {}
模板
void SortArray(int(&Arr)[I]){
现在,您可以使用
I
,并且
sizeof Arr
将像在函数的局部变量堆栈上一样进行报告


您可能不想这样做的原因是,每个大小的数组都将创建函数的新副本。可能会导致严重的肿胀


但是我使用这种技术创建了一个constepr字符串类型。

您可以使用
reference\u 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{}()});
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
标准::列表l(10);
标准::物联网(l.begin(),l.end(),-4);
向量v(l.begin(),l.end());
//不能对列表使用洗牌(需要随机访问),但可以对向量使用洗牌
std::shuffle(v.begin()、v.end()、std::mt19937{std::random_device{}()});
}

您可以使用
reference\u 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{}()});
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
标准::列表l(10);
标准::物联网(l.begin(),l.end(),-4);
向量v(l.begin(),l.end());
//不能对列表使用洗牌(需要随机访问),但可以对向量使用洗牌
std::shuffle(v.begin()、v.end()、std::mt19937{std::random_device{}()});
}

为什么不使用void SortArray(int*Arr)?另一种方法是什么?你想解决的问题是什么?不清楚一个引用数组是如何与你所显示的代码相关的。<代码>主< /COD>必须在C++中返回<代码> int <代码>。你的问题实际上是清楚的,但是标题是误导的,大多数代码都是无关的。你可能应该把你的问题减少到你应该阅读的“参考数组”问题,如果你的老师正在做C++,他们应该告诉你。它基本上是一个动态数组,可以添加元素,删除元素等等。它可以作为引用传递(因为它是一个常规C++对象),它是一种更方便、隐藏的指针。C-方法是传递指向第一个元素和数组中元素总数的指针。为什么不使用void SortArray(int*Arr)?另一种方法是什么?你想解决的问题是什么?不清楚一个引用数组是如何与你所显示的代码相关的。<代码>主< /COD>必须在C++中返回<代码> int <代码>。你的问题实际上是清楚的,但是标题是误导的,大多数代码都是无关的。您可能应该将问题简化为“参考数组”