find_end

提供:cppreference.com
移動: 案内, 検索


#include <algorithm>
 
template< class ForwardIterator1, class ForwardIterator2 >
ForwardIterator1 find_end( ForwardIterator1 first, ForwardIterator1 last, 
                           ForwardIterator2 s_first, ForwardIterator2 s_last );
 
template< class ForwardIterator1, class ForwardIterator2, class BinaryPredicate >
ForwardIterator1 find_end( ForwardIterator1 first, ForwardIterator1 last, 
                           ForwardIterator2 s_first, ForwardIterator2 s_last, BinaryPredicate p );

[s_first, s_last)で示される部分列のうち最後に現れる物を[first, last)の範囲から検索します。1つめのバージョンは要素の比較にoperator==を用い、もう一方は与えられた2項述語pを用います。

目次

[編集] 引数

first, last - 解析する範囲を定義する前方反復子(foward iterator)。

s_first, s_last - 検索するシーケンスを定義する前方反復子(foward iterator)。

p - 要素が等しいものとして扱われるべき場合はtrueを返却する2項述語。

[編集] 返値

[first, last)範囲の中で最後に現れる部分列[s_first, s_last)の先頭の反復子。もし部分列が見つからなかった場合はlastを返します。

[編集] 等価関数

1つめのバージョン:

template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last, 
                          ForwardIterator2 s_first, ForwardIterator2 s_last)
{
    if (s_first == s_last)
        return last;
    ForwardIterator1 result = last;
    while (1) {
        ForwardIterator1 new_result = std::search(first, last, s_first, s_last);
        if (new_result == last) {
            return result;
        } else {
            result = new_result;
            first = result;
            ++first;
        }
    }
    return result;
}

2つめのバージョン:

template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last, 
                          ForwardIterator2 s_first, ForwardIterator2 s_last,
                          BinaryPredicate p)
{
    if (s_first == s_last)
        return last;
    ForwardIterator1 result = last;
    while (1) {
        ForwardIterator1 new_result = std::search(first, last, s_first, s_last, p);
        if (new_result == last) {
            return result;
        } else {
            result = new_result;
            first = result;
            ++first;
        }
    }
    return result;
}

[編集]

以下のコードは2つの異なる数列を検索するためにfind_end()を用いています。

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
    std::vector<int>::iterator result;
 
    std::vector<int> t1{1, 2, 3};
 
    result = std::find_end(v.begin(), v.end(), t1.begin(), t1.end());
    if (result == v.end()) {
        std::cout << "subsequence not found\n";
    } else {
        std::cout << "last subsequence is at: "
                  << std::distance(v.begin(), result) << "\n";
    }
 
    std::vector<int> t2{4, 5, 6};
    result = std::find_end(v.begin(), v.end(), t2.begin(), t2.end());
    if (result == v.end()) {
        std::cout << "subsequence not found\n";
    } else {
        std::cout << "last subsequence is at: " 
                  << std::distance(v.begin(), result) << "\n";
    }
}

出力:

last subsequence is at: 8
subsequence not found

[編集] 計算量

最大S*(N-S+1)回の比較を行います。 ここで、S = distance(s_first, s_last)N = distance(first, last)です。

[編集] 関連トピック

adjacent_find, find, find_first_of, find_if, search_n

個人用ツール
名前空間
変種
操作
案内
ツールボックス
他の言語