C ++泛型迭代器

时间:2014-12-30 21:18:10

标签: c++ generics iterator

我不确定我能找到的答案是否是我需要的最简单的方法。我知道如何修改我的问题的完整解决方案的简单模板将是完成以下任务的代码:

  1. 将两个迭代器作为输入,指向包含值类型为T的东西的可迭代容器(vector,list ...)的开头和结尾。

  2. 返回一个std::vector<T>,其中包含输入容器的逐个元素副本,无论以从开始到结束迭代输入容器的任何顺序完成。

  3. 不起作用的东西如下:

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

    问题是我需要编译器以某种方式检查我是否给出了指向类型为T的迭代器。

    我正在学习C ++并将实践编写为我能想到的某些算法的最通用实现,因此我想从一开始就获得最佳实践。如果使用C ++ 11构造有一种简单的方法,那对我来说没问题。

3 个答案:

答案 0 :(得分:9)

您可以简单地使用特征完全删除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有一个特化,所以这将允许你的函数'&#34;只是工作&#34;即使它是通过指针而不是&#34; true&#34;迭代器对象。

答案 1 :(得分: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';
}

答案 2 :(得分: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,您可以将typename std::decay<X>::type替换为std::decay_t<X>