名稱空間
變體
操作

std::iterator_traits

來自 cppreference.com
 
 
迭代器庫
迭代器概念
迭代器原語
(C++17 中已棄用)
iterator_traits


演算法概念與工具
間接可呼叫概念
常用演算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器介面卡
範圍訪問
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
定義於標頭檔案 <iterator>
template< class Iter >
struct iterator_traits;
template< class T >
struct iterator_traits<T*>;
template< class T >
struct iterator_traits<const T*>;
(C++20 中移除)

std::iterator_traits 是型別特徵類,它為 LegacyIterator 型別的屬性提供統一介面。這使得僅透過迭代器實現演算法成為可能。

該模板可以針對使用者定義的迭代器進行特化,以便即使型別不提供常用 typedef,也可以檢索有關迭代器的資訊。

使用者特化可以將其巢狀型別 iterator_concept 定義為 迭代器類別標籤之一,以指示與迭代器概念的符合性。

(C++20 起)

目錄

[編輯] 模板引數

Iter - 要檢索屬性的迭代器型別

[編輯] 成員型別

巢狀型別 定義
difference_type Iter::difference_type
value_type Iter::value_type
pointer Iter::pointer
reference Iter::reference
iterator_category Iter::iterator_category


如果 Iter 不包含上述五個巢狀型別中的任何一個,則此模板不包含任何具有這些名稱的成員(std::iterator_traits 相容 SFINAE)。

(C++17 起)
(C++20 前)

如果 Iter 沒有 pointer,但包含所有剩餘的四個巢狀型別,則這四個巢狀型別宣告如下:

巢狀型別 定義
difference_type Iter::difference_type
value_type Iter::value_type
pointer void
reference Iter::reference
iterator_category Iter::iterator_category


否則,如果 Iter 滿足僅用於說明的概念 __LegacyInputIterator,則巢狀型別宣告如下:

巢狀型別 定義
difference_type std::incrementable_traits<Iter>::difference_type
value_type std::indirectly_readable_traits<Iter>::value_type
pointer
  • 如果有效,則為 Iter::pointer
  • 否則,如果有效,則為 decltype(std::declval<Iter&>().operator->())
  • 否則為 void
reference
iterator_category


否則,如果 Iter 滿足僅用於說明的概念 __LegacyIterator,則巢狀型別宣告如下:

巢狀型別 定義
difference_type
value_type void
pointer void
reference void
iterator_category std::output_iterator_tag

否則,此模板不包含任何具有這些名稱的成員(std::iterator_traits 相容 SFINAE)。

(C++20 起)

[編輯] 特化

此型別特徵可以針對可作為迭代器使用的使用者提供型別進行特化。標準庫為指標型別 T* 提供部分特化,這使得可以使用原始指標的所有基於迭代器的演算法。

標準庫還為某些標準迭代器介面卡提供部分特化。

(C++20 起)

[編輯] T* 特化巢狀型別

僅當 std::is_object_v<T>true 時才進行特化。

(C++20 起)


巢狀型別 定義
difference_type std::ptrdiff_t
value_type T(直到 C++20)std::remove_cv_t<T>(自 C++20 起)
pointer T*
reference T&
iterator_category std::random_access_iterator_tag
iterator_concept (自 C++20 起) std::contiguous_iterator_tag


const T* 特化巢狀型別

巢狀型別 定義
difference_type std::ptrdiff_t
value_type T
pointer const T*
reference const T&
iterator_category std::random_access_iterator_tag
(C++20 前)

[編輯] 庫型別的特化

std::common_iterator 型別的屬性提供統一介面
(類模板特化) [編輯]
std::counted_iterator 型別的屬性提供統一介面
(類模板特化) [編輯]

[編輯] 示例

顯示了雙向迭代器的通用 std::reverse() 實現。

#include <iostream>
#include <iterator>
#include <list>
#include <vector>
 
template<class BidirIt>
void my_reverse(BidirIt first, BidirIt last)
{
    typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last);
    for (--n; n > 0; n -= 2)
    {
        typename std::iterator_traits<BidirIt>::value_type tmp = *first;
        *first++ = *--last;
        *last = tmp;
    }
}
 
int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};
    my_reverse(v.begin(), v.end());
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
 
    std::list<int> l{1, 2, 3, 4, 5};
    my_reverse(l.begin(), l.end());
    for (int n : l)
        std::cout << n << ' ';
    std::cout << '\n';
 
    int a[]{1, 2, 3, 4, 5};
    my_reverse(a, a + std::size(a));
    for (int n : a)
        std::cout << n << ' ';
    std::cout << '\n';
 
//  std::istreambuf_iterator<char> i1(std::cin), i2;
//  my_reverse(i1, i2); // compilation error: i1, i2 are input iterators
}

輸出

5 4 3 2 1
5 4 3 2 1
5 4 3 2 1

[編輯] 另請參閱

(C++17 中已棄用)
基類,用於簡化簡單迭代器所需型別的定義
(類模板) [編輯]
用於指示迭代器類別的空類型別
(類) [編輯]
計算迭代器的關聯型別
(別名模板)[編輯]