2014-12-30 102 views
1

我不知道我能找到的答案是做我需要的最简单的方法。简单的模板,我会知道如何修改成一个完整的解决我的问题将是代码,完成以下操作:C++泛型迭代器

  1. 的输入是两个迭代器指向一个迭代容器的开头和结尾(矢量,列表...)包含值类型为T的东西。

  2. 返回一个std::vector<T>,其中包含输入容器的逐个元素副本,以任意顺序复制输入容器的开始到结束。

东西非功能将会像如下:

template<typename Iterator, typename T> 
std::vector<T> dumb_copy(Iterator first, Iterator last) { ... } 

问题是,我需要编译器以某种方式检查我指着T类型的东西给迭代器

我目前正在学习C++,并将实践中的某些算法的最通用的实现方式写作为我能想到的,所以我想从一开始就获得最佳实践。如果有一种使用C++ 11构造的简单方法,那对我来说很好。

+1

你为什么需要这个?你不能只从两个迭代器构造矢量吗?顺便说一句,标准库迭代器定义了'value_type',它给你'T'。 – juanchopanza

+0

我以为我需要这个,因为我还没有到Stroustrup那么远...... – JT1

回答

7

您可以简单地使用特性完全去除T类型,允许它被自动确定:

template <typename Iterator> 
std::vector<typename std::iterator_traits<Iterator>::value_type> 
    dumb_copy(Iterator first, Iterator last) 
{ 
    std::vector<typename std::iterator_traits<Iterator>::value_type> copy; 

    // Populate the copy vector 

    return copy; 
} 

特别要注意的是std::iterator_traits具有当迭代器类型是一个指针专业化,因此这将允许你的函数“正常工作”,即使它传递的是指针而不是“真正的”迭代器对象。

2

您不需要这样做,因为标准库容器已经以这种方式工作。所以,你可以直接创建std::vector从两个迭代器:

#include <string> 
#include <vector> 
#include <iostream> 

int main() 
{ 
    std::string s = "hello"; // iterable container 

    // construct a vector using two iterators 
    std::vector<std::string::value_type> v(s.begin(), s.end()); 

    // check the results 
    for(unsigned i = 0; i < v.size(); ++i) 
     std::cout << v[i]; 
    std::cout << '\n'; 
} 
+0

谢谢。正如我所说的,模板的要点只是为了获得正确的类型。我感兴趣的是实现一个算法,它将通过输入容器顺序遍历,进行一些不重要的处理,并将解决方案存储到向量中。 – JT1

+0

@ JT1然后听起来你可能从'std :: for_each()'中受益:http://www.cplusplus.com/reference/algorithm/for_each/ – Galik

2

您只需创建一个std::vector<T>与类型匹配的*it结果的迭代器之一:

#include <type_traits> 
#include <vector> 
template <typename Iterator> 
auto dump_copy(Iterator begin, Iterator end) 
    -> std::vector<typename std::decay<decltype(*begin)>::type> { 
    return std::vector<typename std::decay<decltype(*begin)>::type(begin, end); 
} 

用C++ 14您可以用std::decay_t<X>代替typename std::decay<X>::type