C++按值而不是按引用发送数组以运行
C++ sending array to function by value, not by reference
我对C++有问题。
我有一个对数组进行排序的函数,但我不想在原始数组上工作。我想按值而不是按引用将数组发送到函数。请帮助我。
int bogoSort(int tab[], int n){
int iloscOperacjiDominujacych = 0;
cout<<"rozpoczalem algorytm BogoSort"<<endl;
srand (time(NULL));
named (outer)
while(true){
// cout<<"Zaczal sie while"<<endl;
named (inner)
for(int i = 0; i < n; i++){
if(i == n-1){
break (outer);
}
if (tab[i] > tab[i+1]){
break (inner);
}
}
for(int i = n-1; i > 0; i--){
iloscOperacjiDominujacych++;
//operacja dominujaca to zamiana dwoch elementow w tablicy, wykonuje sie ZAWSZE najwiecej razy i jest najbardziej zlozona
int swapPostition = rand() % (i+1); //wylosowanie liczby miedzy <0;i> nalezacej do calkowitych
int temp = tab[i];
tab[i] = tab[swapPostition];
tab[swapPostition] = temp;
}
}
// cout<<"Wykonal sie while"<<endl;
show(tab,n);
return iloscOperacjiDominujacych;
}
按 C++ 中的值传递数组。如果您不想修改原始数组,那么您要么必须自己制作一个单独的副本并操作副本,要么使用 std::vector
或 std::array
(如果您有 C++11)并按值传递和返回(因为您可以复制 std::vector
或 array
)。
C++ 关于函数声明的说法
确定每个参数的类型后,任何类型为"T 数组"或"返回 T 的函数"的参数都将调整为"指向 T 的指针"或"指向返回 T 的函数的指针",[dcl.fct] 8.3.5/5
因此,当您想要传递数组时C++最终会传递指向原始数组的第一个元素的指针,而不是像其他类型一样制作副本并按值传递它。这是 C 兼容性的不幸结果,我不知道为什么 C 认为这种不一致是个好主意。
在任何情况下,C++都为静态大小的数组提供std::array
,为动态大小的数组提供std::vector
。由于 C 数组的奇怪之处,您应该尽可能避免使用它们。(很少有你无法避免的情况)
int tab[]
是一个具有未知边界的数组,因此不能使用静态大小的std::array
,必须使用 std::vector
:
int bogoSort(std::vector<int> tab){
并不是说您不再需要 n
参数,因为向量知道自己的大小。这是 std::vector 和 std::array 比数组更安全的方式之一。即使向量确实有与记住该大小相关的额外开销,它实际上是零开销,因为它使您不必在其他地方执行该工作。
如果你真的想使用一个C数组(你不应该),你可以简单地手动复制它。
int bogoSort(int const *tab,int n) {
std::vector<int> tab_copy(tab,tab+n);
bogoSort(tab_copy);
}
int bogoSort(std::vector<int> tab) {
...
}
如您所见,我在内部使用一个向量,并且我有一个接受向量的 bogoSort 重载。将此与使副本成为原始数组进行比较:
int bogoSort(int const *tab,int n) {
int *tab_copy = new int[n];
std::copy(tab,tab+n,tab_copy); // manual copying
bogoSort_impl(tab_copy,n); // not overloading, hidden internal function
delete [] tab_copy; // resource cleanup. We're not exception safe!
}
// or
int bogoSort(int const *tab,int n) {
// unqiue_ptr for exception safety
std::unqiue_ptr<int[]> tab_copy = std::unqiue_ptr<int[]>(new int[n]);
std::copy(tab,tab+n,tab_copy.get());
bogoSort_impl(tab_copy.get(),n);
}
所以再说一次,你真的不应该使用 C 数组。他们太麻烦了,没有任何好处。
不能按值传递 C 样式数组。故事结束。
但是,您可以按包含数组的值传递类类型的变量。利用此问题的最简单方法是使用 std::array
:
void f(std::array<int, 10> a);
std::array<int, 10> a;
f(a);
该类基本上只是类似于struct { int data[10]; };
,所以如果你真的愿意,你甚至可以自己滚动。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 代码使用向量成功运行,但使用数组显示错误
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 在 c++ 中是否允许创建具有运行时边界的数组?
- 运行时C++数组初始化问题
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 如何在 Visual Studio C++ 11 中运行时定义二维数组?
- 传递数组结构、ofstream 和 interger 以运行
- c++:运行一个函数 8 次,并将每个答案添加到数组或 JSON 中
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- 如何在运行时阻止数组重置
- 运行搜索数组
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 排列程序无法写入数组 - 运行时错误
- 2d 数组运行时错误 "std::bad_alloc()" what()
- C++2d数组运行时错误
- 我认为做而正在进入无限循环.或数组.(运行时错误)
- 数组运行时错误
- 数组运行时错误