【问题标题】:Templated Iterator declaration模板化迭代器声明
【发布时间】:2016-03-30 00:32:58
【问题描述】:

我必须创建一个适用于向量、链表和双链表的通用函数。 我想使用迭代器进行解析以查找 val 是否在向量、链表或双链表中。 我只是不知道如何声明一个泛型迭代器。以下是我对声明的尝试。

template <class Container, class T>
void findValue(Container &x, const T &val){
std::x<T>::iterator it;
}

【问题讨论】:

  • 一种方法是将std::list&lt;Whatever&gt; 作为容器传递,并使用Container::iterator
  • 不使用std::find有什么原因吗?
  • @PeteBecker 这个函数的最终目标是查看 val 是否已经存在,如果存在,该函数将在它已经存在的地方插入 val 。因此,如果 val 为 3,则 { 2,4,3,5} 将是 {2,4,3,3,5}。而且我认为 find 不会返回该位置。
  • std::find 返回迭代器
  • @Lin0523 您在评论中的问题描述与原始问题中的问题无关。

标签: c++ templates iterator


【解决方案1】:

由于 C++ 容器定义了嵌套类型 iterator,您可以使用 typename Container::iterator 在您的 findValue 函数中声明一个迭代器(尽管 auto 也可以工作)。也无需将T 作为单独的模板参数,因为您可以使用typename Container::value_type

template<typename Container>
void findValue(Container& x, const typename Container::value_type & val)
{
    // could use 'typename Container::iterator' instead of 'auto'
    for (auto it = begin(x); it != end(x); ++it)
    {
        if (*it == val)
        {
            std::cout << "found " << val << std::endl;
            break;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多