我试图为std :: initalizer_list类型创建一个基本的data()
函数,以从列表中提取数据。但是,在sum({1, 2, 3, 4})
的基本和函数中尝试时,我会得到结果1447450180
而不是10
:
template < typename _Ty > const _Ty *data(const std::initializer_list<_Ty> &_List)
{
_Ty *data = new _Ty[_List.size()];
for (typename std::initializer_list<_Ty>::iterator i = _List.begin();
i != _List.end(); ++i, *data++ = *i);
return data;
}
int sum(std::initializer_list<int> numbers)
{
int total = 0;
for(int i = 0; i < numbers.size(); ++i, total += data(numbers)[i]);
return total;
}
int main()
{
std::cout << sum({1, 2, 3, 4});
getchar();
}
答案 0 :(得分:1)
2个错误:
for (typename std::initializer_list<_Ty>::iterator i = _List.begin();
i != _List.end(); ++i, *data++ = *i);
您正在递增data
指针,该指针会跳过先前分配的内存。创建count
变量:
int count = 0;
data[count++] = *i
但是现在你正在跳过循环的第一个元素,因为你首先递增然后取消引用。切换订单。最后一个循环应该如下:
for (typename std::initializer_list<_Ty>::iterator i = _List.begin();
i != _List.end(); data[count++] = *i, ++i);
答案 1 :(得分:0)
此功能
template < typename _Ty > const _Ty *data(const std::initializer_list<_Ty> &_List)
{
_Ty *data = new _Ty[_List.size()];
for (typename std::initializer_list<_Ty>::iterator i = _List.begin();
i != _List.end(); ++i, *data++ = *i);
return data;
}
至少因为存在内存泄漏而无效。每次调用该函数时,它都会为数组数据分配一个新内存,并且永远不会删除该数组。
此外,该函数将指针返回到数组之外,因为在其中指针已被更改,即它已递增。
此外,您还不知道如何正确编写循环。在这个循环中,你1)跳过序列的第一个元素,2尝试超出序列。
for (typename std::initializer_list<_Ty>::iterator i = _List.begin();
i != _List.end(); ++i, *data++ = *i);
正确的循环看起来
for (typename std::initializer_list<_Ty>::iterator i = _List.begin();
i != _List.end(); ++i ) *data++ = *i;
同样适用于第二个循环,因为它也是无效的
for(int i = 0; i < numbers.size(); ++i, total += data(numbers)[i]);
有vshould
for(int i = 0; i < numbers.size(); ++i ) total += data(numbers)[i];
此外,我对你的发明没有任何意义。
答案 2 :(得分:0)
使用简单的解决方案,而不是复杂的解决方案。
#include <numeric>
template<typename T>
T sum(std::initializer_list<T> vals)
{
return std::accumulate(vals.begin(), vals.end(), T{});
}