如何使一个函数填充发送到函数的数组?而不是其参数中的数组

时间:2018-04-30 22:37:00

标签: c++ arrays function

如何创建一个函数来填充发送给函数的原始数组,而不是函数中的唯一函数?到目前为止,在我的代码中我手动完成,但我想创建一个存储值并对数组进行排序的函数。我不确定如何将它应用于原始数组而不是函数参数中定义的数组。

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>

using namespace std;

class Functions
{
private:
    int input{};
    int numRows{};
    int numColumns{};
    int holder{};

public:
    void rndArrayMaxNumber (int x, int y)
    {
        int tempArray [x][y]{};
        srand(time(0));

        for (int j=0;j<x;j++)
        {
            for (int i=0;i<y;i++)
            {
                tempArray[j][i]= (rand()%99)+1;
            }
        }

        for (int j=0;j<x;j++)
        {
            for (int i=0;i<x-1;i++)
            {
                for (int k=0;k<y-1;k++)
                {
                    if (tempArray[i][k] < tempArray[i][k+1])
                    {
                        holder=tempArray[i][k];
                        tempArray[i][k]=tempArray[i][k+1];
                        tempArray[i][k+1]=holder;
                    }
                }

            }
        }

        for (int j=0;j<y;j++)
        {
            for (int i=0;i<y-1;i++)
            {
                for (int k=0;k<x-1;k++)
                {
                    if (tempArray[k][i] < tempArray[k+1][i])
                    {
                        holder=tempArray[k][i];
                        tempArray[k][i]=tempArray[k+1][i];
                        tempArray[k+1][i]=holder;
                    }
                }

            }
        }

        for (int i=0;i<y;i++)
        {
            for (int k=0;k<x;k++)
            {
                cout << tempArray[i][k] << "\t";
            }
            cout << endl;
        }
        cout << endl << "The greatest number is " << tempArray[0][0];
    }

    void arrayChoice ()
    {
        cout << "Enter the number of rows: ";
        cin >> numRows;
        cout << "Enter the number of columns: ";
        cin >> numColumns;
        cout << endl;
    }

    void menu ()
    {
        while (input!=7)
        {
            cout << "1. 2D array random numbers and show highest number" << endl;
            cout << "2. Exit" << endl << endl;
            cout << "Enter the number of the menu option you want to proceed with: ";
            cin >> input;
            cout << endl;
            switch (input)
            {
                case 1:
                    arrayChoice();
                    rndArrayMaxNumber(numRows, numColumns);
                    cout << endl << endl;
                    break;
            }
        }
    }
};

int main()
{
    Functions program;
    program.menu();
    return 0;
}

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。

您可以使用标头中定义的begin()和end()函数。这些返回第一个和一个超过数组中的最后一个指针。这允许你做这样的事情

void arr(int *b, int *e)
{
        /*code that reads/changes array i.e b[1] = 1 b[3] = 2 etc.*/
}
int main() {
        int a[10]; 
        arr(begin(a), end(a)); 
}

另一种方法是将指针传递给数组中的第一个元素以及数组的大小

void arr(int *b, size_t sz)
{
        /*code that reads/changes array */
}
int main() {     
        int a[10]; 
        arr(a, 10); 
}

您也可以通过引用或指针传递数组,如此

void array_function(T (*pointer_to_array)[n])

其中T表示类型,n表示数组的大小。 因此,传递一个大小为10的int类型的数组将如下所示:

int a[10];

array_function(&a);

从那里你可以使用deference和下标运算符访问函数体中数组中的元素:

*pointer_to_array[element] 对函数中的变量所做的更改将反映在数组a

您也可以通过引用传递数组:

void array_function(T (&reference_to_array)[n])

以类似的方式将数组传递给函数,但没有运算符&的地址

int a[10];

array_function(a);

可以使用参数名称和下标运算符在函数体中访问数组及其元素:

reference_to_array[element]

因此对reference_to_array所做的任何更改也会反映在a

答案 1 :(得分:0)

数组无法可靠地动态调整大小,因为C ++标准要求在编译程序时知道所有数组的大小。一些编译器允许动态大小的数组作为扩展,但由于所有事情都是非标准的,因此不能指望支持。如果除了可移植性之外没有其他原因,可以避免使用可变长度阵列。还有很多其他原因(discussion here)。

下一个令人讨厌的是,在传递数组时,除了第一个维之外的所有维都必须在编译时知道。如果编译器允许创建它们,则无法传递动态大小的2D数组。

行。那你做什么呢?常见的解决方案是

std::vector<std::vector<int>> array_2d(x, std::vector<int>(y));

然后通过引用传递array_2d以最小化复制

void rndArrayMaxNumber (std::vector<std::vector<int>> & array_2d)

无需通过xyvector知道它有多大。

这很简单,而且非常自我维护。这可能就是你需要的一切。如果你正在编写高性能代码,你很可能不会问这个问题或阅读这个答案。

也就是说,它有一些性能上的缺点,因为单个vector保证是一个连续的内存块,vector的{​​{1}}不是。这会导致程序在内存中追逐指针并且容易出现缓慢的缓存行为。每次程序必须离开CPU和高速缓存以从RAM(或上帝禁止,交换文件)中获取内容时,您将离开一个运行在数千兆赫兹的环境中运行数百兆赫或更糟的环境。

更多关于如何在这里讨厌的问题:https://blog.codinghorror.com/the-infinite-space-between-words/

此外,每项拨款都有成本。一个大的分配成本远低于vector大小vectorx x的大小vector

因此我推荐一个基于单y的简单矩阵类。

vector

请注意,此答案根本不会将#include <iostream> #include <vector> // template because if you are going to write this, why restrict yourself to just int? template<class TYPE> class Matrix { private: // good to know how big you are size_t rows, columns; // and the vector containing the data std::vector<TYPE> matrix; public: Matrix(size_t numrows, size_t numcols) : rows(numrows), // remember the size columns(numcols), matrix(rows * columns) // and allocate storage { } // does the same thing as the other constructor, except it sets a default value Matrix(size_t numrows, size_t numcols, TYPE init) : rows(numrows), columns(numcols), matrix(rows * columns, init) { } // gets the value at row, column and allows it to be modified TYPE & operator()(size_t row, size_t column) { // check bounds here if you want // note the indexing math mapping 2 dimensions into 1 return matrix[row * columns + column]; } // gets a copy of the the value at row, column TYPE operator()(size_t row, size_t column) const { return matrix[row * columns + column]; } // obvious what the next two methods do size_t getRows() const { return rows; } size_t getColumns() const { return columns; } }; // handy dandy output helper. friend std::ostream & operator<<(std::ostream & out, const Matrix & in) { for (int i = 0; i < in.getRows(); i++) { for (int j = 0; j < in.getColumns(); j++) { out << in(i, j) << ' '; } out << '\n'; } return out; } 纳入等式中。

如果你想走这条路,你必须做更多,更多的工作。 How do I declare a 2d array in C++ using new?会让你开始沿着这条路走下去,但是再次,你最好包装一个数组:How do I create a subscript operator for a Matrix class?

特别注意未实现的复制构造函数和赋值运算符。这是在动态数组周围制作一个好的矩阵类的神奇方法,并且由于我只能归因于虐待狂的原因,他们被排除在那个例子之外。请阅读What is The Rule of Three?,了解有关需要的原因。即使您使用new,也值得阅读“三条规则”链接,因为如果没有牢牢抓住“三条规则”(and its friends Five and Zero),就无法编写非平凡的C ++。

Documentation on std::vector