【问题标题】:Value Type from Arbitrary Iterator in Template Function模板函数中任意迭代器的值类型
【发布时间】:2013-08-12 02:12:33
【问题描述】:

我正在尝试从迭代器参数中检索值类型。我怎么能那样做?我用谷歌搜索了它并看到了一些 iterator_trait 特性,但不知道如何在我的函数上实现它。我的迭代器模板化为 T 可以采用整数或浮点数,在以下函数中,我试图遍历整数或浮点数的容器,并根据值类型将它们存储到新的向量容器中。

总而言之,我如何从任意迭代器中获取值类型信息

template<typename T>
void Merge_Function(T begin, T mid, T end) {
    vector<auto> left_half (begin, mid);
    left_half.push_back(INFINITE);
    vector<auto> right_half (mid+1, end);
    right_half.push_back(INFINITE);
}

更新: 我想做的是一种就地合并排序。

vector<int> numbers = {5, 6, 3, 4, 1, 2, 7, 13, -6, 0, 3, 1, -2};
vector<int> L_half(numbers.begin(), numbers.end());

这行得通,所以我在下面尝试类似的事情

 template<typename T>
 void practice(T begin, T end) {
   auto length = end - begin;
   auto mid = length/2;
   typedef typename std::iterator_traits<T>::value_type value_type;
   vector<value_type> L_half(begin, mid);
   vector<value_type> R_half(mid+1, end);
   R_half.push_back(10000);
   }

所以在主函数中 我打电话

   practice(numbers.begin(), numbers.end());

起初我包括以下内容

 #include <iostream>
 using namespace std;
 #include <algorithm>
 #include <vector>
 #include <iterator>

 template<typename T>
 void practice(T begin, T end);

但是在排队 向量 L_half(begin, mid);

我收到了错误

     /~~/main.cpp:105:14: No matching constructor for initialization of 'vector<int>'

我正在使用最新版本的 macbook air。

【问题讨论】:

    标签: c++ templates vector stl iterator


    【解决方案1】:
    typedef typename std::iterator_traits<T>::value_type value_type;
    std::vector<value_type> left_half(begin, mid);
    ...
    

    您也可以在 C++11 中执行此操作:

    typedef typename std::remove_reference<decltype(*begin)>::type value_type;
    

    这也适用于没有value_type 定义的延迟实现的迭代器类。

    如果由于某种原因,您没有实际的迭代器可以使用,而只有迭代器类型,则更一般的形式是:

    typedef typename std::remove_reference<decltype(*std::declval<T>())>::type value_type;
    

    【讨论】:

    • 没有匹配的构造函数用于初始化 'std::vector' 我明白了……有什么想法吗?
    • @asd213sasdd2254121:在我展示的三个中,您使用的是哪个 typedef?
    • @asd213sasdd2254121:第一个,你#include &lt;iterator&gt;了吗?
    • 是的,我愿意。我已经包含了那个库
    • @asd213sasdd2254121:在你的练习函数中,mid是一个整数。您可能希望它成为一个迭代器。试试auto mid = begin + length/2;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2021-07-29
    • 2012-12-26
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多