2013-03-01 56 views
2

我正在嘗試爲矢量添加一些調試工具。我的課程「有一個」矢量並提供如下功能:連續內存的InputIterator?

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

矢量和字符串是具有連續內存的容器。當firstlast來自一個向量(或具有連續內存的其他容器)時,我可以對迭代器執行額外的理智檢查。例如,我可以檢查:

  • 最後>第一
  • [第一,最後一個)不與現有的元素重疊
  • 計數=最後 - 第一+ 1是明智的

我想要在容器使用連續內存時爲附加診斷和檢測提供專門化,但我不知道迭代器被調用的是什麼(並且無法通過源來定位它):

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

'SequentialIterator'或'ContiguousIterator'的名稱是什麼?

+1

['標準:: random_access_iterator_tag'(HTTP://en.cppreference。 COM/W/CPP /迭代器/ iterator_tags)? – 2013-03-01 00:32:38

回答

2

不能保證特定迭代器下的序列元素是連續的。您只能對使用迭代器執行的操作進行保證。主要有四種迭代器類型:

  • 隨機存取
  • 雙向
  • 正向
  • 輸入

他們每個人都能(除輸入)也滿足了輸出迭代,要求其使他們可變的迭代器。

您要求的最接近的迭代器是隨機訪問迭代器。它支持與><進行比較,並允許您相互添加和減去迭代器。你甚至可以使用數組下標操作符。他們給出了這樣的錯覺,即元素是連續存儲的,但不能保證它們真的存在。

+0

輸入迭代器不滿足輸出迭代器。 – 2013-03-01 00:31:12

+0

「不能保證序列的元素是連續的。」你確定嗎?例如,我總是保證字符串是連續的。我認爲它也適用於矢量。我知道它不適用於列表。在列表的情況下,我將不得不使用'InputIterator'並放棄額外的儀器和診斷。 – jww 2013-03-01 03:33:20

+1

@noloader有*保證'std :: basic_string'和'std :: vector'連續存儲它們的元素。但是這與用於訪問它們的迭代器無關。當然,連續存儲元素使得提供隨機訪問迭代器變得更容易,這就是他們這樣做的原因。沒有保證,如果你有一個隨機訪問迭代器,那麼它指向的數據是連續的。 – 2013-03-01 09:09:20

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... 
    } 
}; 
+0

爲什麼'is_same'和'bool'而不是僅僅使用實際的標籤?我見過的所有東西都只使用了實際的標籤。這就是爲什麼它被稱爲標籤調度。 http://stacked-crooked.com/view?id=897e78f36e82154b3520dee357ae7f33 – 2013-03-01 00:28:56

+1

'InputIterator :: iterator_category' - 應該是 - >'std :: iterator_traits :: iterator_category' – 2013-03-01 00:30:53

+0

@BenjaminLindley:對,謝謝。 – 2013-03-01 00:31:37