2

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

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

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

  • 最后 > 第一个
  • [first, last) 不与现有元素重叠
  • count = last - first + 1 是理智的

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

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

“SequentialIterator”或“ContiguousIterator”的名称是什么?

4

2 回答 2

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...
    }
};
于 2013-03-01T00:28:11.453 回答
2

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

  • 随机访问
  • 双向
  • 向前
  • 输入

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

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

于 2013-03-01T00:23:57.100 回答