簡體   English   中英

動態陣列打印功能

[英]Dynamic Array print function

在這篇文章中

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;
}    

//我的動態數組類

#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)

請注意,operator <<函數返回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&而不是預定義的cout。

如果您希望函數能夠打印到cout以外的ostream ,則可以這樣做

//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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM