如何在c++中按值传递数组
how to pass array by value in c++
我有以下代码
#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];
}
}
我的第一个问题是如何按值传递数组,这样原始数组就不会改变,其次,我的排序函数没有生成正确的排序,我想按降序对数组进行排序。
在惯用C++中,一个由5个int
s组成的数组arr
被声明为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];
}
}
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/6521788https://stackoverflow.com/a/16137995/6521788
您可以将值复制到一个新的数组中
基本答案:在C++中不能按值传递数组。
解决方案1:在将C样式数组传递给函数之前,先复制它,并删除您的return语句,因为不需要它。
解决方案2:使用std::array
,这是一个提供与基本数组相同功能的容器,也是一个复制构造函数和复制赋值运算符。
其他备注:STL确实提供了排序算法(std::sort
),所以在未来程序员的生活中,不要自己实现排序算法,除非你在性能重要的地方做了一些非常具体的事情。
您的问题表明,对于如何处理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。以获取更多信息&bubblesort的工作原理请参阅https://de.wikipedia.org/wiki/Bubblesort
for (int j = 1; j< 5; j++) {
应校正为CCD_ 15,因为最后的元素已经就位。
if (arr[i]< arr[j]) {
应该更正为CCD_ 16,因为您想比较(例如)第一个元素&按降序/升序获取的下一个元素。对数组中的每个数字对都执行此操作。
最后:
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中,用j(5)覆盖arr[j+1],最后将6存储在j中以获得降序(希望我现在就得到了,但你得到了要点)
最后;正如其他人已经正确指出的那样,您可以使用std::swap
而不是使用key/temp变量。
- 按平均值替换数组中的元素
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 如何在c++中按值传递数组
- 使用指针传递数组值
- 2D数组值像数组一样传递,0不打印
- 将字符串数组从fortran传递到C/C DLL,并获取具有更改值的数组
- 如何避免意外地按值而不是按引用获取数组元素
- 按引用传递数组并修改值C++
- 使用 C 按引用传递数组
- C++按值而不是按引用发送数组以运行
- 在C++中,按值传递数组和引用传递数组之间的差异
- 按值传递时改变整型数组的大小
- 按值传递字符数组,并从函数返回一个新的字符数组
- c++按值传递结构数组
- 我可以在c++中按值返回数组吗?
- 为什么我们不能传递数组按值运行?
- 在传递数组作为值的函数中基于范围的for循环
- 按值传递数组
- 按值传递 typedef(固定大小)数组