2

ベクターのデバッグ インストルメンテーションを追加しようとしています。私のクラスにはベクトルが「あり」、次のような機能が提供されます。

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

ベクトルと文字列は、連続したメモリを持つコンテナーです。firstとがベクトル (または連続したメモリを持つ他のコンテナー) からのものである場合last、イテレータに対して追加のサニティ チェックを実行できます。たとえば、次のことを確認できます。

  • 最後 > 最初
  • [first, last) 既存の要素と重複しない
  • count = 最後 - 最初 + 1 は正気です

コンテナーが連続したメモリを使用する場合に、追加の診断とインストルメンテーションの特殊化を提供したいのですが、イテレーターが何と呼ばれているのかわかりません (ソースを grep して見つけることができませんでした):

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

「SequentialIterator」または「ContiguousIterator」の名前は何ですか?

4

2 に答える 2

3

タグのディスパッチといくつかの標準型特性を使用しassign()て、イテレータのカテゴリに基づいて の適切な実装を選択できます。

たとえば、この基本的なソリューションでは、ランダム アクセス反復子と非ランダム アクセス反復子に対して 2 つの異なる実装を提供できます。

#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

特定の反復子の下にあるシーケンスの要素が連続しているという保証はありません。イテレータで実行できる操作についてのみ保証があります。主なイテレータの種類は次の 4 つです。

  • ランダムアクセス
  • 双方向
  • 前方
  • 入力

それぞれ (Input を除く) は Output Iterator の要件も満たすことができるため、変更可能な反復子になります。

求めているものに最も近い反復子は、ランダム アクセス反復子です。>andとの比較をサポートし<、相互に反復子を加算および減算できます。配列添字演算子を一緒に使用することもできます。要素が連続して格納されているように見せかけますが、実際にそうであるという保証はありません。

于 2013-03-01T00:23:57.100 に答える