c++ 数组遍历期间的修改

nwnhqdif  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(120)
int * decrementArrayElements(int numbers[], int size){
    for (int &x: numbers)
    {
        x = x-1;
    }
    return numbers ;
}

字符串
以及所提到的我试图dec瓦尔的每个数组ele由1的范围为基础
如果我尝试正常的for循环,它就能工作

int * decrementArrayElements(int numbers[], int size){
    // int n= sizeof(numbers)/sizeof(numbers[0]);
    for (int i=0; i<size; i++)
        numbers[i]=numbers[i]-1;
    return numbers;
}


所以请解释一下这背后的原因

7fhtutme

7fhtutme1#

参数int numbers[]实际上是一个指针,而不是数组。基于范围的循环不适用于指针。
如果你有一个C风格的数组,不管出于什么原因,你需要安全地传递给一个函数,你可以使用一个函数模板。这允许编译器从数组的类型推导出数组的大小。

#include <cstdint>
#include <iostream>

template <std::size_t size>
int * decrementArrayElements(int (&numbers)[size])
{
    for (int &x : numbers) --x;
    return numbers;
}

int main()
{
    int numbers[] = { 1, 2, 3, 4 };
    decrementArrayElements(numbers);
    for (int x : numbers) std::cout << x;
}

字符串
产出:

0123


在这种情况下,返回指针的模式可能没有那么有用。它更有可能被滥用。我倾向于使用函数void
您可能需要考虑使用std::array,它具有更好的封装性,并且(与C风格的数组不同)具有与其他类型一致的复制语义。

#include <array>
#include <cstdint>
#include <iostream>

template <std::size_t size>
std::array<int, size>& decrementArrayElements(std::array<int, size>& numbers)
{
    for (int &x : numbers) --x;
    return numbers;
}

int main()
{
    std::array<int, 4> numbers = { 1, 2, 3, 4 };
    decrementArrayElements(numbers);
    for (int x : numbers) std::cout << x;
}

相关问题