[英]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& stream
和dynamic_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.