C++ 使用数组作为参数创建泛型函数

C++ Create a generic function with an array as parameter

本文关键字:参数 创建 泛型 函数 数组 C++      更新时间:2023-10-16

我是C++新手。我是来自C的学生。

我的目标是编写一个简单的函数,该函数在参数中接受数组。 我成功了,但我对结果不满意。

主.cpp

#include <array>
#include <iostream>
#include "MyMath.hpp"
int main()
{
std::array<int, 5> array = {1, 2, 3, 5, 4};
MyMath::sortIntArray(array);
std::cout << array.at(3) << std::endl;
return 0:
}

我的数学.hpp

#include <array>
class MyMath {
public:
static void sortIntArray(std::array<int, 5> &array)
{
array.at(3) = 99;
}
}

我创建了一个类来包含我的函数,因为这是学校的编码风格。 我对上述代码的问题是我在函数的参数中编写了数组的大小。"如果我想对 500 个数字的数组进行排序怎么办?">

1) 所以我的问题是:编写相同函数而不必写入数组大小的最佳方法是什么?

2) 我做了一些研究,我知道 std::vector,但是当您想创建具有固定大小的数组时,使用 std::array 不是更合适吗?

3) 我可以解决 C 样式数组的问题:通过将数组的最后一个元素设置为 NULL 或将大小作为第二个参数发送。但是对数组和字符串使用类等效不是更合适吗?(std::array/std::vector/std::string,几乎不再使用 int[])

4)我见过"模板",可以让我实现我的目标,但是在编写了排序算法的第二个小函数后,我注意到我必须为每个将std::array作为参数的函数使用模板,这太疯狂了。

如果答案是简单地使用 std::vector 或 int[]。我需要 std::array 吗?(因为在我看来它并不比 int[] 好,所以我可以用 int[] 解决问题,正如我在 3 中所说的那样)。而且我无法解决标准::数组的问题)

有4个问题。对于我对这种语言的一般不满,我认为考虑回答所有 4 个问题(即使它只是一个很短的句子)很重要。 提前谢谢你。

看看 std::sort 的界面。它不采用具体的容器类型,而是采用通用[start, end)迭代器对。然后,如果调用方想要对向量进行排序,他们可以传入一对std::vector<int>::iterator_type。如果他们想对 5 个整数的数组进行排序,他们可以传入std::array<int, 5>::iterator_type.如果他们想对 C 样式数组进行排序,他们可以传入int*s。

1)所以我的问题是:编写相同函数而不必编写数组大小的最佳方法是什么?

没有最好的方法,这取决于你需要做什么。

如果要使用这样的std::array,则必须使用模板。

如果你在编译时不需要大小,你有更多的选择,例如你稍后描述的选项。

2)我做了一些研究,我知道std::vector,但是当你想创建一个固定大小的数组时,使用std::array不是更合适吗?

是的,它是。它们不是等效的解决方案,它们适用于不同的用例。

3)我可以解决C-Style数组的问题:通过将数组的最后一个元素设置为NULL或将大小作为第二个参数发送。但是对数组和字符串使用类等效不是更合适吗?(std::array/std::vector/std::string,几乎不再使用 int[])

这要看情况。同样,请记住,使用这些解决方案并不等效,因为在编译时不会知道大小!

4)我见过"模板",可以让我实现我的目标,但是在编写了排序算法的第二个小函数后,我注意到我必须为每个将std::array作为参数的函数使用模板,这太疯狂了。

"疯狂"是什么意思?

std::array

通常是处理大小在编译时固定且已知的数组的更C++方法,而不是 C 样式数组。与旧阵列相比,至少有一个好处是易于复制;从一个array到另一个的单个分配,而不是逐个元素的副本,并有助于防止意外的浅拷贝。

如果在编译时不知道大小,请使用std::vector。一旦你知道实际大小,您就可以使用它resize方法,然后像对待数组或array一样对待它(即,使用[]进行索引)。