1

我有 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;
}
4

3 回答 3

8

在 C++ 中无法按值传递数组。如果您不想修改原始数组,那么您要么必须自己制作一个单独的副本并操作该副本,要么使用std::vectoror std::array(如果您有 C++11)并按值传递和返回它(因为您可以复制std::vectorarray)。

于 2012-04-14T16:49:14.973 回答
4

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 数组。他们太麻烦了,没有任何好处。

于 2012-04-14T17:12:41.673 回答
3

不能按值传递 C 样式的数组。故事结局。

但是,您可以按包含数组的值传递类类型的变量。利用它的最简单方法是使用std::array

void f(std::array<int, 10> a);

std::array<int, 10> a;
f(a);

这个类基本上就是这样的struct { int data[10]; };,所以如果你真的想的话,你甚至可以自己滚动它。

于 2012-04-14T16:55:35.153 回答