动态数组打印功能

Dynamic Array print function

本文关键字:功能 打印 数组 动态      更新时间:2023-10-16

在本帖

https://codereview.stackexchange.com/questions/5745/dynamic-array-improvements-0

这是什么意思?对不起,如果问题是模糊的…我只需要更新我的print_array函数。完整的代码如下…为我可怜的人的动态数组。

谁能告诉我怎么超载的<<函数工作?

// My Current Print Array
void print_array() 
{ 
    for (int i = 0; i < size; i++) cout << array[i] << endl; 
} 

如果你要写print_array,至少写它,以便它可以使用替代流(不仅仅是std::cout)。然后写出输出操作符

//SO用户建议

std::ostream& operator<<(std::ostream& stream, dynamic_array const& data)
{
    data.print_array(stream); // After you fix print_array
    return stream;
}    

//My Dynamic Array Class

#include "c_arclib.cpp"
template <class T> class dynamic_array
{
private:
    T* array;
    T* scratch;
public:
    int size;
    dynamic_array(int sizein)
    {  
        size=sizein;
        array = new T[size]();
    }
    void print_array()
    {  
        for (int i = 0; i < size; i++) cout << array[i] << endl;
    }
    void merge_recurse(int left, int right)
    {  
        if(right == left + 1)
        {  
            return;
        }
        else
        {  
            int i = 0;
            int length = right - left;
            int midpoint_distance = length/2;
            int l = left, r = left + midpoint_distance;
            merge_recurse(left, left + midpoint_distance);
            merge_recurse(left + midpoint_distance, right);
            for(i = 0; i < length; i++)
            {  
                if((l < (left + midpoint_distance)) && (r == right || array[l] > array[r]))
                {  
                    scratch[i] = array[l];
                    l++;
                }
                else
                {  
                    scratch[i] = array[r];
                    r++;
                }
            }
            for(i = left; i < right; i++)
            {  
                array[i] = scratch[i - left];
            }
        }
    }
    int merge_sort()
    {  
        scratch = new T[size]();
        if(scratch != NULL)
        {  
            merge_recurse(0, size);
            return 1;
        }
        else
        {  
            return 0;
            }
    }
    void quick_recurse(int left, int right)
    {  
        int l = left, r = right, tmp;
        int pivot = array[(left + right) / 2];
        while (l <= r)
        {  
            while (array[l] < pivot)l++;
            while (array[r] > pivot)r--;
            if (l <= r)
            {  
                tmp = array[l];
                array[l] = array[r];
                array[r] = tmp;
                l++;
                r--;
            }
        }
        if (left < r)quick_recurse(left, r);
        if (l < right)quick_recurse(l, right);
    }
    void quick_sort()
    {  
        quick_recurse(0,size);
    }
    void rand_to_array()
    {  
        srand(time(NULL));
        int* k;
        for (k = array; k != array + size; ++k)
        {  
            *k=rand();
        }
    }
};
int main()
{  
    dynamic_array<int> d1(10);
    cout << d1.size;
    d1.print_array();
    d1.rand_to_array();
    d1.print_array();
    d1.merge_sort();
    d1.print_array();
}

~~

从您的示例中,每当操作符<<如果std::ostream& streamdynamic_array const& data匹配,编译器将调用:

std::ostream& operator<<(std::ostream& stream, dynamic_array const& data) 
{ 
     data.print_array(stream); // After you fix print_array 
     return stream; 
}

,其行为类似于全局操作符。换句话说,调用:

dynamic_array<int> d(10);
cout << d;
// above is logically equivalent to:
// operator<<(std::cout, d)

注意操作符<<函数返回std::ostream&。这是因为我们希望能够链接操作符调用:

dynamic_array<int> d(10);
cout << "Data:" << d;
// above is logically equivalent to:
// operator<<( operator<<(std::cout, "Data:"), d);

由于使用模板来输出数组,因此要输出的流必须知道如何解释模板类型。在这个例子中,我们使用的是整数,并且有一个预定义的操作符:

std::ostream& operator<<(std::ostream& stream, int const& i);

唯一需要改变的想法是Joshua建议修改你的print_array函数来使用ostream&

如果您希望您的函数能够打印到ostream s而不是cout,您可以这样做

//i added a default argument of cout, so you don't have to specify
void print_array(std::ostream &os = cout) 
{ 
  for (int i = 0; i < size; i++) 
     os << array[i] << endl; 
} 

operator<<()函数可以解释如下:它返回对ostream对象的引用,cout是该类的一部分。返回引用允许链接。现在,由于operator<<()不是成员函数,第一个实参是操作符的左侧,在许多情况下,它将是cout。第二个实参是操作符的右侧。我不认为这是有效的c++语法,应该是const dynamic_array &data