Open In App

std::search in C++

Last Updated : 16 Sep, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

std::search is defined in the header file <algorithm> and used to find out the presence of a subsequence satisfying a condition (equality if no such predicate is defined) with respect to another sequence.

  • It searches the sequence [first1, last1) for the first occurrence of the subsequence defined by [first2, last2), and returns an iterator to its first element of the occurrence, or last1 if no occurrences are found.
  • It compares the elements in both ranges sequentially using operator== (version 1) or based on any given predicate (version 2). A subsequence of [first1, last1) is considered a match only when this is true for all the elements of [first2, last2). Finally, std::search returns the first of such occurrences.

It can be used in either of the two versions, as depicted below:

For Comparing Elements Using ==

Syntax

std::search (first1, last1, first2, last2);

Parameters

  • first1: Forward iterator to beginning of first container to be searched into.
  • last1: Forward iterator to end of first container to be searched into.
  • first2: Forward iterator to the beginning of the subsequence of second container to be searched for.
  • last2: Forward iterator to the ending of the subsequence of second container to be searched for.

Return Value

  • Returns an iterator to the first element of the first occurrence of [first2, last2) in [first1, last1), otherwise,
  • Returns last1 if no occurrences are found.

Example

C++
// C++ program to demonstrate the use of std::search
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int i, j;

    // Declaring the sequence to be searched into
    vector<int> v1 = {1, 2, 3, 4, 5, 6, 7};

    // Declaring the subsequence to be searched for
    vector<int> v2 = {3, 4, 5};

    // Declaring an iterator for storing the returning pointer
    vector<int>::iterator i1;

    // Using std::search and storing the result in
    // iterator i1
    i1 = std::search(v1.begin(), v1.end(), v2.begin(), v2.end());

    // checking if iterator i1 contains end pointer of v1 or not
    if (i1 != v1.end())
    {
        cout << "vector2 is present at index " << (i1 - v1.begin());
    }
    else
    {
        cout << "vector2 is not present in vector1";
    }

    return 0;
}

Output
vector2 is present at index 2

For Comparison Based on a Predicate (or Condition)

std::search(first1, last1, first2, last2, pred);

Parameters

All the arguments are same as previous template, just one more argument is added.

  • pred: Binary function that accepts two elements as arguments (one of each of the two containers, in the same order), and returns a value convertible to bool. The returned value indicates whether the elements are considered to match in the context of this function. The function shall not modify any of its arguments. This can either be a function pointer or a function object.

Return Value

  • Returns an iterator to the first element of the first occurrence of [first2, last2) in [first1, last1), otherwise,
  • Returns last1 if no occurrences are found.

Example

C++

// C++ program to demonstrate the use of std::search
// with binary predicate
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

// Defining the BinaryPredicate function
bool pred(int i, int j)
{
    if (i > j)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int main()
{
    int i, j;

    // Declaring the sequence to be searched into
    vector<int> v1 = {1, 2, 3, 4, 5, 6, 7};

    // Declaring the subsequence to be compared to based
    // on predicate
    vector<int> v2 = {3, 4, 5};

    // Declaring an iterator for storing the returning pointer
    vector<int>::iterator i1;

    // Using std::search and storing the result in
    // iterator i1 based on predicate pred
    i1 = std::search(v1.begin(), v1.end(), v2.begin(), v2.end(), pred);

    // checking if iterator i1 contains end pointer of v1 or not
    if (i1 != v1.end())
    {
        cout << "vector1 elements are greater than vector2 starting "
             << "from position " << (i1 - v1.begin());
    }
    else
    {
        cout << "vector1 elements are not greater than vector2 "
             << "elements consecutively.";
    }

    return 0;
}

Output
vector1 elements are greater than vector2 starting from position 3

Complexity Analysis of std::search()

Time Complexity

The time complexity of std::search varies depending on the container it is being used on. For,

  • Vector/Deque/Array (sequential search): O(n)
  • Set/Map (tree-based): O(log n)
  • Unordered Set/Map (hash-based): O(1) for average, O(n) for worst-case

Auxiliary Space

The std::search function does NOT use extra space that grows with the number of elements. So, in every case, the auxiliary space will be O(1).



Next Article
Article Tags :
Practice Tags :

Similar Reads