c++ - 模板函数中任意迭代器的值类型

标签 c++ templates vector stl iterator

我正在尝试从迭代器参数中检索值类型。我怎么能这么做呢?我用谷歌搜索并看到一些 iterator_trait 功能,但无法弄清楚如何在我的函数上实现它。我的迭代器模板化为 T 可以采用整数或 float ,并且在以下函数中,我尝试迭代整数或 float 的容器,并根据值类型将它们存储到新的 vector 容器中。

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

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

但在行中 vector L_half(开始, 中间);

我收到错误

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

我使用的是 MacBook Air,最新版本。

最佳答案

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;

关于c++ - 模板函数中任意迭代器的值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158656/

相关文章:

c++ - 动态分配数组的地址会根据数组的声明方式而变质吗?

c++ - 在 C++ 中的条件或控制语句中声明和初始化变量

c++ - C++ 编译器如何优化模板代码?

c++ - 无法从 vector 的对象访问 getter

c++ - 减少重载函数的冗余代码(const& vs &)

c++ - 你如何声明一个内联类?

c++ - 模板类中使用了错误的构造函数

c++ - 函数作为模板参数

c++ - 在 vector 中插入一些值?

c++ - std::vector 破坏和意外内存泄漏