将阵列传回主体

时间:2017-07-08 06:32:59

标签: c++

我正在思考我的优化项目中网络中的可用功能..我偶然发现了Bateesh的可用代码,我发现它非常有用。但我想略微修改他的代码,以便

**而不是打印输出,它将在我的主体中传输,以便在下一个过程中使用。

我该怎么做?我有新的C ++,所以任何建议都会有所帮助。我目前正在阅读有关传递阵列的内容,但我对这些新想法感到茫然。

谢谢。

    // Program to print all combination of size r in an array of size n
#include <stdio.h>
#include <stdlib.h>
void combinationUtil(int arr[], int n, int r, int count, int data[], int i);

// Needed for qsort.  See http://w...content-available-to-author-only...s.com/reference/cstdlib/qsort/
int compare (const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}

// The main function that prints all combinations of size r
// in arr[] of size n. This function mainly uses combinationUtil()
void printCombination(int arr[], int n, int r)
{
    // A temporary array to store all combination one by one
    int data[r];

    // Sort array to handle duplicates
    qsort (arr, n, sizeof(int), compare);

    // Print all combination using temprary array 'data[]'
    combinationUtil(arr, n, r, 0, data, 0);
}

/* arr[]  ---> Input Array
   n      ---> Size of input array
   r      ---> Size of a combination to be printed
   index  ---> Current index in data[]
   data[] ---> Temporary array to store current combination
   i      ---> index of current element in arr[]     */
void combinationUtil(int arr[], int n, int r, int index, int data[], int i)
{
    // Current cobination is ready, print it
    if (index == r)
    {
        for (int j=0; j<r; j++)
            printf("%d ",data[j]);
        printf("\n");
        return;
    }

    // When no more elements are there to be put
    if (i >= n)
        return;

    // current is included, put next at next location
    data[index] = arr[i];
    combinationUtil(arr, n, r, index+1, data, i+1);

    // Remove duplicates
    while (arr[i] == arr[i+1])
        i++;

    // current is excluded, replace it with next (Note that
    // i+1 is passed, but index is not changed)
    combinationUtil(arr, n, r, index, data, i+1);
}

// Driver program to test above functions
int main()
{
    int arr[] = {1, 2, 1, 3, 1};
    int r = 3;
    int n = sizeof(arr)/sizeof(arr[0]);
    printCombination(arr, n, r);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您可以通过将函数std::vector<std::string>中的返回类型更改为printCombination来返回数组。由于combinationUtil()被称为递归,因此最好从std::vector<std::string>函数传递printCombination变量的引用,并让它由combinationUtil()填充。最后,您可以从printCombination返回该变量,并将其提供给main()

答案 1 :(得分:1)

根本不要使用数组

我不会回答你问的问题,因为我认为在大多数情况下原始阵列都很糟糕。如果它们被传递则更是如此(这就是你所要求的)。

但是,C ++确实提供了原始数组的替代方法(std::arraystd::vector。除非你自己编写容器,否则我建议优先考虑这些原始数组。他们的表现非常稳固。

使用C ++标准库函数

如果我理解正确,您试图在给定的数字集合中显示唯一值的所有可能排列。您可以使用一些C ++库函数来执行此操作:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
  // Create vector
  std::vector<int> v { 1, 2, 1, 3, 1 };

  // Sort vector
  std::sort(v.begin(), v.end());

  // Move all duplicate entries to the end of the vector
  auto it = std::unique(v.begin(), v.end());

  // Trim vector so that the duplicates are no longer contained
  v.resize(std::distance(v.begin(), it));

  // Iterate as long as the function can rearrange the objects as a
  // lexicographicaly greater permutation
  do
  {
    // Print all elements in the vector
    for(auto i : v)
      std::cout << i << " ";

    // Add new line character and flush output
    std::cout << std::endl;

  } while(std::next_permutation(v.begin(),v.end()));

  return 0;
}

输出:

1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1