我正在尝试用传入的值填充给定的数组,所以如果我想要一个数组都是12' s 它只需用12s替换所有元素。我对此函数的原型如下所示:
void fill(T *left, T *end, T fill)
此功能的驱动程序如下所示:
static void TestFill1(void)
{
cout << "***** Fill1 *****" << endl;
int i1[10];
int size = 10;
fill(i1, i1 + size, 12);
display(i1, i1 + size);
}
我遇到了一个问题,我给了一个未初始化的数组。以前在作业中我经历了阵列直到结束。在这种情况下,我得到一个未初始化的数组,这使得我的T * end与T * left相同。我不熟悉通过传入数组的方法。
我正在尝试看起来像这样的东西:
template <typename T>
void fill(T *left, T *end, T fill)
{
int i = sizeof(*left) / sizeof(*(left + 0));
while(*(left + i) != *end)
{
*(left + i) = fill;
++i;
}
}
我也不允许使用下标或for循环进行此分配,#include与std :: vector相同。
答案 0 :(得分:1)
变量i
表示相对于第一个元素的偏移量,应该从零开始:
int i = 0;
循环条件是检查数组元素的值是否等于最后数组元素的值。
while(*(left + i) != *end)
正确的版本如下:
while(left + i != end)
检查指针 (left + i)
是否已到达结尾。
答案 1 :(得分:0)
您的陈述
int i = sizeof(*left) / sizeof(*(left + 0));
可能不会,你认为它做什么。
sizeof()
函数对普通指针的作用与数组声明的作用相同:
size_t s = sizeof(*left); // Will evaluate to sizeof(T)
而
int i1[10];
size_t s = sizeof(i1); // Will evaluate to sizeof(int) * 10
您的代码可以简单地修复如下:
template <typename T>
void fill(T *left, T *end, T fill) {
T* cur = left;
while(cur < end) {
*cur = fill;
++cur;
}
}
答案 2 :(得分:0)
http://www.cplusplus.com/reference/vector/vector/assign/
#include <vector>
int main ()
{
std::vector<int> first;
first.assign (10,12); // 10 ints with a value of 12
return 0;
}
这就是真正的男人如何做到这一点。大声抱歉,我无法抗拒。