C++ 使用数组作为参数创建泛型函数
C++ Create a generic function with an array as parameter
我是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
一样对待它(即,使用[]
进行索引)。
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 如何使用可选的随机种子参数创建 roll_die() 函数
- 基于参数创建数组
- 从可变参数创建枚举?
- 如何从可变参数模板参数创建 std::tuple<>?
- 在 C++ 中按参数创建不同类型的对象?
- 根据参数创建派生类的新实例
- 基于模板参数创建多个类实现
- C++ 从模板参数创建元组向量
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- 在构造函数中使用参数创建一个类数组
- 是否可以使用C 函数中的const int参数创建数组
- 如何使用不同对象的模板容器作为参数创建模板类
- C++:基于积分模板参数创建可变长度元组
- 使用按插入方式排序的参数创建哈希映射
- 避免为非默认参数创建临时变量?
- 是否可以根据参数创建返回对旧项目的引用的构造函数
- 使用整数模板参数创建编译时双精度
- C++ 使用数组作为参数创建泛型函数
- 基于参数创建基类中的派生类