C++ 数组作为参数

C++ 数组作为参数,c++,C++,当我将数组作为参数传递时,我想知道其中哪一个是最好的 void function(int arr[]) {...}; 或 你能告诉我你的理由吗?你可以参考哪本书?谢谢 它们在语义上是相同的 #1稍微好一点(在我看来),因为它明确表示您正在传递数组 将数组作为参数传递的最佳方法实际上是: void函数(type_t*数组、int amounteflets、int arrayallocatedlets) 在某些情况下(如传递字符串时),通常可以跳过这两个参数。但无论哪种方式,它们都可能有用,例如在

当我将数组作为参数传递时,我想知道其中哪一个是最好的

void function(int arr[]) {...};


你能告诉我你的理由吗?你可以参考哪本书?谢谢

它们在语义上是相同的


#1稍微好一点(在我看来),因为它明确表示您正在传递数组

将数组作为参数传递的最佳方法实际上是:

void函数(type_t*数组、int amounteflets、int arrayallocatedlets)

在某些情况下(如传递字符串时),通常可以跳过这两个参数。但无论哪种方式,它们都可能有用,例如在对字符串执行某些操作时,或者它们可能会为您节省一两个strlen调用


在我看来,在函数参数中使用[]选项令人困惑,应该避免。但我不认为这是一种惯例。

如果您只想传递任何数组(包括动态分配的数组),它们是等价的

如果函数需要实际的固定大小数组,可以执行以下操作:

template <size_t N>
void function(char (&str)[N]) { ... }
模板
空函数(char(&str)[N]){…}

由于此问题已标记,因此我将两者都不使用。如果必须使用此选项,则两者都是等效的

但是由于使用C++,一个更好的方法是使用<代码> STD::vector < /COD>这些任务

void function(std::vector<int> &arr) {...}
空函数(std::vector&arr){…}
或者,如果不修改数组/向量

void function(const std::vector<int> &arr) {...}
void函数(const std::vector&arr){…}

您询问要从中选择哪一个

void function(int arr[]) {...};

后者允许您将指针本身声明为
const
,而前者仅允许您将项目声明为
const
。但是,对于读取器,
[]
表示数组,而不是指向单个对象的指针。就我个人而言,我认为
const
提供的约束比
[]
提供的数组度指示更实用


对于更高级别的代码,请使用
std::vector
std::array
,以更合适的为准。

根据您想要提供的抽象层,您应该在Olaf的方法或STL使用的高级方法之间进行选择:

template <class Iter>
void function(Iter first, Iter last)
{
    // for example, to get size:
    std::size_t size = std::distance(first, last);
    // for example, to iterate:
    for ( Iter it = first; it != last; ++it )
    {
        // *it to get the value, like:
        std::cout << *it << std::endl;
    }
}
模板
空洞函数(Iter优先,Iter最后)
{
//例如,要获取大小,请执行以下操作:
std::size\u t size=std::距离(第一个,最后一个);
//例如,要迭代:
for(Iter it=第一;it!=最后;++it)
{
//*它需要获取值,如:

std::难道它们在语法上不同吗?它们在语义上是等价的。我必须承认,我更喜欢#2,但不是因为它显式地传递一个数组;我更喜欢它,因为它显式地传递一个地址=p当你传递一个数组函数时,它作为指向数组第一个元素的指针衰减。所以两者都是id诱惑。在这些函数中,
void函数(std::string const&str){…};
是最好的。建议阅读:
void function(int* arr) {...};
template <class Iter>
void function(Iter first, Iter last)
{
    // for example, to get size:
    std::size_t size = std::distance(first, last);
    // for example, to iterate:
    for ( Iter it = first; it != last; ++it )
    {
        // *it to get the value, like:
        std::cout << *it << std::endl;
    }
}
int tab[4] = {1,2,3,4};
function(tab, tab+4);

std::vector<int> vec;
// fill vector with something
function(vec.begin(), vec.end());