在cpp中使用for_each循环遍历数组

时间:2019-08-20 07:45:31

标签: c++ arrays

首先,这是代码:

#include <iostream>
#include <algorithm>

using namespace std;




class Array
{

    int* arr;
    int n;

    public:

    Array();
    Array(const Array&);
    Array(Array &&);
    Array& operator=(const Array&);
    Array& operator=(Array &&);
    void print();
    ~Array();
};

Array::Array()
{
    cout<<"No of elements: "<<endl;
    cin>>n;
    if(n!=0)
    {
       arr = new int [n];
       cout<<"\nInsert values:"<<endl;
       for_each(arr, arr+n, [](int x){cin>>x;});
    }
}

Array::Array (const Array& a)
{   
    int i=0;
    this->n=a.n;
    arr= new int [n];
    for(i=0;i<n;i++)
       arr[i]=a.arr[i];
}

Array::Array (Array &&a)
{
    this->n=a.n;
    arr=a.arr;
    a.arr=nullptr;
}

Array& Array::operator=(const Array& a)
{
    int i=0;
    this->n=a.n;
    arr= new int [n];
    for(i=0;i<n;i++)
       arr[i]=a.arr[i];
    return *this;
}

Array& Array::operator=(Array &&a)
{
    this->n=a.n;
    arr=a.arr;
    a.arr=nullptr;
    return *this;
}

void Array::print()
{
    for_each(arr, arr+n, [](int a){cout<<a;});
}

Array::~Array()
{
    n=0;
    delete [] arr;
}

int main()
{   
    Array a;
    Array b;
    Array c=a;
    Array d;
    d=b;
    c.print();
    cout<<endl;
    d.print();

    return 0;
}

因此,正如您所看到的,我创建了默认构造函数(如果没有参数的构造函数可以称为默认构造函数),则使用for_each循环创建一个数组,并将lambda函数用作第三个参数,正如您所看到的那样它接受我插入的值并将其放置为变量x的值,该值应从arr [0]到arr [n-1]。

但是,当我打印在main中创建的任何数组时,它只打印零,这不是由于复制构造函数引起的,因为我尝试打印数组a和b并发生了相同的事情(请注意,在这种情况下,我是打印出c和d,因为它们分别是a和b的副本)。

我还试图查看它是否正常工作,因为我试图在for_each循环完成后立即打印出数组的某些元素,结果证明for_each循环对数组没有影响,因为即使在循环之后它也保持为零。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:6)

使用for_each循环时,您传递的是lambda

for_each(arr, arr+n, [](int x){cin>>x;});

但是lambda (int x)的参数表示您正在创建数组元素的副本,将为其分配值。当您离开lambda的主体时,该副本将被销毁,而数组内部的原始值保持不变。

将其更改为

for_each(arr, arr+n, [](int& x){cin>>x;});

那样,您将不会在数组内部创建值的副本,但是会传递对其的引用,这意味着您会将值写入数组。