如何将元素定义为与随机访问迭代器指向的元素相同的类型?

Posted

技术标签:

【中文标题】如何将元素定义为与随机访问迭代器指向的元素相同的类型?【英文标题】:How can I define an element to be the same type as an element pointed at by a random access iterator? 【发布时间】:2014-10-10 23:15:48 【问题描述】:

我想将 v 定义为与下面 RAIterator 指向的元素相同的类型。

template < class RAIterator , class Comparator >
  void g_quick_sort_3w_opt (RAIterator beg, RAIterator end, Comparator& cmp)
  
    if ((end-beg) < 2)
        return;

    RAIterator low = beg;
    RAIterator hih = end;
    RAIterator i = beg;

    T v = *beg; //I want T to be the type of an element pointed at by RAIterator

    while (!(i == hih))
           
        if (cmp(*i , v)) Swap(*low++, *i++);
        else if (*i == v) ++i;
        else Swap(*i, *--hih);
    
    g_quick_sort_3w_opt(beg, low, cmp);
    g_quick_sort_3w_opt(hih, end, cmp);
  

Swap 来自 genalg.h

现在我的测试输入是一个整数列表,如果我使用 int 而不是 T,上述方法有效。

【问题讨论】:

【参考方案1】:

看看std::iterator_traits,尤其是referencevalue_type 成员。

typename std::iterator_traits<RAIterator>::value_type v = ...;
typename std::iterator_traits<RAIterator>::reference v = ...;

当然,仅使用自动类型推断可能会为您提供很好的服务:

auto v = ...; // Beware of proxies

【讨论】:

简单提一下iterator_traits 旨在处理原始指针以及标准迭代器(以及遵循标准约定的非标准迭代器)。【参考方案2】:

typename RAIterator::value_type v = *beg;

【讨论】:

希望迭代器是类类型,对吧? T* 是一个有效的迭代器类型。 @Deduplicator ...我看到你已经写过。我会清除我的垃圾。 @Deduplicator 从头开始​​。我会留下它,因为您的评论提出了一个值得一目了然的观点。【参考方案3】:

使用 C++11,您可以使用auto

auto v = *beg;

【讨论】:

以上是关于如何将元素定义为与随机访问迭代器指向的元素相同的类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素

如何将迭代器指向向量中大于或等于目标数的元素

Java核心技术卷一笔记7

迭代器知识整理

迭代器

3.4 迭代器