给定Iterators作为参数的适当类型的STL容器

时间:2014-02-04 15:45:53

标签: c++ templates stl iterator

我想编写一个模板函数,它将一些STL容器的两个迭代器First和Last作为其参数,并返回一个STL容器,其中包含符合某些条件的两个迭代器之间的那些元素(的副本)。换句话说,我想要这样的东西:

template <typename Type>
Type Foo(Type::iterator First, Type::iterator Last)
{
    Type Result;
    for (Type::iterator i = First; i != Last; i++)
    {
        if (...)
        {
           Result.push_back(*i);
        }
    }
    return Result;
}

然而,这不会编译,因为编译器说“Type::iterator不是类型”(我用std::vector<double>称呼它)。

我只是简单地弄错了语法?或者我完全以错误的方式做这件事?

谢谢。

3 个答案:

答案 0 :(得分:3)

使用:

template <typename Type>
Type Foo(typename Type::iterator First, typename Type::iterator Last)

你无法推断Type(并且可能有多种可能性) (你必须这样称呼Foo<Container>(first, last)

你可以创建一个类型特征来完成这项工作; 类似的东西:

template <typename T> struct get_container;

template <typename T*>
struct get_container<T*>
{
    typedef std::vector<T> type;
};

template <typename T>
struct get_container<std::list<T>::iterator>
{
    typedef std::list<T> type;
};

// And so on: care of possible conflict.

然后你有:

template <typename It>
typename get_container<It>::type Foo(It First, It Last)
{
    typename get_container<It>::type Result;
    for (It it = First; it != Last; ++it) {
        if (...) {
           Result.push_back(*it);
        }
    }
    return Result;
}

答案 1 :(得分:1)

尝试使用

typename Type::iterator

答案 2 :(得分:1)

template <typename Container, typename InputIterator>
Container Foo(InputIterator First, InputIterator Last)
{
  using namespace std;
  Container Result;
  copy_if(First,Last, back_inserter(Result),pred)
  return Result;
}