C ++ std :: initializer_list data()函数错误

时间:2014-02-20 18:03:33

标签: c++

我试图为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();
}

3 个答案:

答案 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);

Live Demo

答案 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{});
}

http://coliru.stacked-crooked.com/a/524ffb543683d901