C++ 中的冒泡排序函数
Bubble Sorting Function in 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);
}
最终函数:
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;
}
}
}
}
感谢大家的回答。
您可以使用函数模板(以及对数组的引用,而不是引用数组(注意括号))执行此操作:
template<size_t ArrayLength>
void SortArray(int (&Arr)[ArrayLength]) {
...
}
您的代码有多个问题。让我列出来
using namespace std;
-- 永远不要这样做。
#define UBound
-- 首先,你永远不需要这个宏。其次,这个定义有问题。
- SortArray 正在尝试接收引用数组。它应该是
template <size_t N> void SortArray(int (&Arr)[N])
——接收对数组的引用;或 void SortArray(int Arr[], size_t len)
有,但不一定是您应该使用的:
template < size_t I >
void SortArray(int (&Arr)[I]) {}
现在您将能够使用 I
并且 sizeof Arr
将像在函数的局部变量堆栈上一样进行报告。
您可能不想这样做的原因是每个大小的数组都会创建该函数的一个新副本。可能导致严重肿胀。
但是我用这个技巧做了一个constexpr字符串类型。
可以使用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{}()});
}
不允许引用数组。我知道在 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);
}
最终函数:
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;
}
}
}
}
感谢大家的回答。
您可以使用函数模板(以及对数组的引用,而不是引用数组(注意括号))执行此操作:
template<size_t ArrayLength>
void SortArray(int (&Arr)[ArrayLength]) {
...
}
您的代码有多个问题。让我列出来
using namespace std;
-- 永远不要这样做。#define UBound
-- 首先,你永远不需要这个宏。其次,这个定义有问题。- SortArray 正在尝试接收引用数组。它应该是
template <size_t N> void SortArray(int (&Arr)[N])
——接收对数组的引用;或void SortArray(int Arr[], size_t len)
有,但不一定是您应该使用的:
template < size_t I >
void SortArray(int (&Arr)[I]) {}
现在您将能够使用 I
并且 sizeof Arr
将像在函数的局部变量堆栈上一样进行报告。
您可能不想这样做的原因是每个大小的数组都会创建该函数的一个新副本。可能导致严重肿胀。
但是我用这个技巧做了一个constexpr字符串类型。
可以使用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{}()});
}