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

时间:2018-12-18 19:15:11

标签: c++ arrays

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

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

main.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:
}

MyMath.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-Style数组解决问题:通过将数组的最后一个元素设置为NULL或将size作为第二个参数发送。但是使用类等效的数组和字符串更合适吗? (std :: array / std :: vector / std :: string几乎不再使用int []了)

4)我看到了可以使我成功实现目标的“模板”,但是在编写了排序算法的第二个小函数之后,我注意到对于每个采用std :: array的函数,我都必须使用模板作为疯狂的参数。

如果答案是简单地使用std :: vector或int []。我会需要std :: array吗? (因为我认为它并不比int []好,所以我可以使用int []解决问题,如我在3中所说)。而且我不能用std :: array解决问题)

有4个问题。对于我对这种语言的普遍不了解,我认为考虑所有四个问题(即使只是很短的一句话)也很重要。 预先谢谢你。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

  

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

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

如果您想像这样使用std::array,则必须使用模板。

如果在编译时不需要大小,则还有更多选择,例如您稍后描述的内容。

  

2)我已经做过一些研究,并且我了解std :: vector,但是当您要创建固定大小的数组时,使用std :: array不是更合适吗?

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

  

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

这取决于。再次提醒您,使用这些解决方案并不等效,因为在编译时不会知道大小!

  

4)我看到了可以使我成功实现目标的“模板”,但是在编写了排序算法的第二个小函数之后,我注意到对于每个采用std :: array的函数,我都必须使用模板作为疯狂的参数。

“疯狂”是什么意思?

答案 2 :(得分:1)

std::array通常是使用C ++处理数组大小固定且在编译时已知的数组的方式,而不是C样式的数组。与旧阵列相比,至少有一个好处是易于复制。从一个array到另一个std::vector的一次分配,而不是逐个元素的复制,并且有助于打击意外的浅表复制。

如果在编译时不知道大小,请使用resize。一旦知道了实际大小,便可以使用它的array方法,然后将其与数组或[]一样对待(即,用if privacy_policy_link.match(/#{domain}($|\/$)/) errors.add(:privacy_policy_link, 'Link to a specific privacy policy page on your site instead of your homepage.') end进行索引)。