如何递归地从迭代器定义向量

时间:2018-01-15 12:39:16

标签: c++

我试图在函数中声明一个新的向量,其值类型来自迭代器,如下所示。如果此函数不是递归的,则它正在编译,但是当函数调用它时,self不会编译。

template<typename ForwardIterator>
auto Foo(ForwardIterator f, ForwardIterator l) {
    typedef typename iterator_traits<ForwardIterator>::value_type T;
    auto n = distance(f,l);
    vector<T> v(n);
    auto h = n /2;
    auto m = next(f,h);     
    auto vr = Foo(f,m); // If this line is commented it is compiling
    return v;
}
int main() {
    vector<int> v = { 38, 27, 43, 3, 9, 82, 10 };
    auto rv = Foo(v.begin(), v.end());
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的编译器似乎无法推断出auto类型。您可以通过实现iterator_type2vector_type帮助程序类来帮助它推断返回类型。

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

template<typename ForwardIterator>
struct iterator_type2vector_type {
    typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
    typedef std::vector<value_type> vector_type;
};

template<typename ForwardIterator>
typename iterator_type2vector_type<ForwardIterator>::vector_type
Foo(ForwardIterator begin, ForwardIterator end) {
    typedef typename iterator_type2vector_type<ForwardIterator>::vector_type vector_type;
    // add your code here.
    return vector_type(begin, end);
}


int main() {
    auto a = {1, 2 ,3, 4};
    auto result = Foo(std::begin(a), std::end(a));
    std::copy(std::begin(result), std::end(result), std::ostream_iterator<int>(std::cout, ", "));
    return 0;
}

auto返回类型是 c ++ 14 功能,因此通过此更改,您可以使用 c ++ 11