我遇到了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;
}
答案 0 :(得分:8)
无法在C ++中按值传递数组。如果您不想修改原始数组,那么您必须自己制作单独的副本并操作副本,或者使用std::vector
或std::array
(如果您有C ++ 11)并传递并按值返回(因为您可以复制std::vector
或array
)。
答案 1 :(得分:4)
C ++说关于函数声明
确定每个参数的类型后,任何类型为“T of 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数组。他们太麻烦了,没有任何好处。
答案 2 :(得分:3)
你不能按值传递C风格的数组。故事结束。
你可以然后按包含数组的值传递class-type的变量。最简单的方法是使用std::array
:
void f(std::array<int, 10> a);
std::array<int, 10> a;
f(a);
该课程基本上就像struct { int data[10]; };
一样,所以如果你真的想要,你甚至可以自己动手。