连续内存的InputIterator?

时间:2013-03-01 00:20:05

标签: c++ templates input iterator

我正在尝试为矢量添加一些调试工具。我的班级“有一个”向量,并提供如下功能:

template <typename InputIterator>
  void assign(InputIterator first, InputIterator last)

Vector和字符串是具有连续内存的容器。当firstlast来自向量(或具有连续内存的其他容器)时,我可以对迭代器执行额外的健全性检查。例如,我可以查看:

  • 最后&gt;第一
  • [first,last]不与现有元素重叠
  • count = last - first + 1 is sane

当容器使用连续的内存时,我想为其他诊断和检测提供专门化,但我不知道迭代器的调用是什么(并且无法通过源来查找它):

template <typename SequentialIterator>
  void assign(SequentialIterator first, SequentialIterator last)

'SequentialIterator'或'ContiguousIterator'的名称是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用标记调度和一些标准类型特征来根据迭代器的类别选择assign()的适当实现。

例如,这个基本解决方案允许您为随机访问迭代器和非随机访问迭代器提供两种不同的实现:

#include <type_traits>
#include <iterator>

struct X
{
    template <typename InputIterator>
    void assign(InputIterator first, InputIterator last)
    {
        assign_impl(
            first, last,
            typename std::iterator_traits<InputIterator>::iterator_category()
            );
    }

    template <typename InputIterator>
    void assign_impl(InputIterator first, InputIterator last,
                     std::random_access_iterator_tag)
    {
        // Implementation for random access iterator...
    }

    template <typename InputIterator>
    void assign_impl(InputIterator first, InputIterator last, 
                     std::input_iterator_tag)
    {
        // Implementation for non-random access iterator...
    }
};

答案 1 :(得分:2)

无法保证特定迭代器下的序列元素是连续的。您可以使用迭代器执行的操作只有保证。有四种主要的迭代器类型:

  • 随机访问
  • 双向
  • 转发
  • 输入

它们每个(输入除外)也满足输出迭代器的要求,这使得它们成为可变迭代器。

与您要求的最接近的迭代器是随机访问迭代器。它支持与><的比较,并允许您相互添加和减去迭代器。您甚至可以使用数组下标运算符。他们给出了连续存储元素的错觉,但不能保证它们确实存在。