动态数组打印功能
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;
}
//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& 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)
注意操作符<<函数返回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
。
相关文章:
- 打印功能无法正常工作 - 链表
- 阵列打印功能
- 控制台打印时间功能产生1
- 为什么我的打印功能不起作用?链表
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- 使用一个功能打印最大值和平均值
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 以C++打印BST的功能
- 为什么我的打印功能之一删除节点
- 打印功能不会终止
- 如何正确格式化此打印功能
- 使用for_each从对象列表中调用打印功能
- 在模板功能中打印任何结构
- 在1个功能中打印相反的三角递归C
- 打印功能的地址..声明
- 作为参数传递的打印功能指针导致屏幕上打印"1"
- 如何在 txt 文件上打印出功能
- 如何使用keybd_event功能打印/按'@'?
- C++单独的功能打印
- 使用复印功能打印集