◐ Shell
clean mode source ↗

std::distance - cppreference.com

提供: cppreference.com

<tbody> </tbody>

ヘッダ <iterator> で定義

template< class InputIt > typename std::iterator_traits<InputIt>::difference_type distance( InputIt first, InputIt last );

(C++17未満)

template< class InputIt > constexpr typename std::iterator_traits<InputIt>::difference_type distance( InputIt first, InputIt last );

(C++17以上)

first から last までのホップ数を返します。

引数

lastfirst を (繰り返し) インクリメントすることによって first から到達できなければ、動作は未定義です。

(C++11未満)

InputItLegacyRandomAccessIterator でない場合、 lastfirst を (繰り返し) インクリメントすることによって first から到達できなければ、動作は未定義です。 InputItLegacyRandomAccessIterator の場合、 lastfirst から到達可能でなく firstlast から到達可能でなければ、動作は未定義です。

(C++11以上)
first - 最初の要素を指すイテレータ
last - 範囲の終端を指すイテレータ
型の要件
-InputItLegacyInputIterator の要件を満たさなければなりません。 InputIt がさらに LegacyRandomAccessIterator の要件も満たす場合、操作はより効率的になります。

戻り値

first から last まで行くために必要なインクリメント回数。 ランダムアクセスイテレータが使用され、 firstlast から到達可能であれば、値は負になることがあります。 (C++11以上)

計算量

線形。

ただし、 InputIt がさらに LegacyRandomAccessIterator の要件も満たす場合、計算量は定数時間になります。

#include <iostream>
#include <iterator>
#include <vector>

int main() 
{
    std::vector<int> v{ 3, 1, 4 };
    std::cout << "distance(first, last) = "
              << std::distance(v.begin(), v.end()) << '\n'
              << "distance(last, first) = "
              << std::distance(v.end(), v.begin()) << '\n';
               //the behavior is undefined (until C++11)
}

出力:

distance(first, last) = 3
distance(last, first) = -3

関連項目