Find all occurrences of a sub string in a string | CPP | Both Case Sensitive & InSensitive

In the previous article, we have discussed about Find and Replace all occurrences of a sub string in C++. Let us learn how to find all occurrences of a sub string in a string in C++ Program.

Finding all occurrences of a sub string in a string both Case Sensitive & InSensitive in C++

This article is all about finding all occurrences of a sub string in both case sensitive and insensitive manner.

Find All Case occurrences of a Sub String in a given String- Case Sensitive :

We will use std::string::find to search the first occurrence then go on searching like this upto last.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

void hasOccuredAtIndex(std::vector<size_t> &vec, std::string str, std::string subStr)
{
    // Adding the first occurence of the substring to the vector
    size_t loc = str.find(subStr);
    while (loc != std::string::npos)
    {
        vec.push_back(loc);
        //Finding and adding the ext occurence of the substring
        loc = str.find(subStr, loc + subStr.size());
    }
}

int main(int argc, char const *argv[])
{
    std::string str = "We are going through an example. We will be seeing how many times the word \'we\' occurs";
    std::string subStr = "We";
    std::vector<size_t> vec;
    hasOccuredAtIndex(vec, str, subStr);
    //The string and substring were passed with a vector which will store the indices of occurence
    std::cout << "The indices where the string \"" << subStr << "\" has occured" << std::endl;
    for (size_t loc : vec)
        std::cout << loc << std::endl;
    return 0;
}

Output :
The indices where the string "We" has occured
0
33

The find( ) function is case-sensitive so we could only get the indices of two occurrences of our substring.

Find all occurrence of a Sub String in a given String- Case Insensitive :

Here we are going to use the same approach as the previous example but we will modify the find( ) function to make it case insensitive. We will modify it by creating another function that will take the string and convert them to a lowercase which will solve our case issue.

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

size_t modifiedFind(std::string str, std::string subStr, size_t loc = 0)
{
    // Converting the whole string into lower case
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);

    std::transform(subStr.begin(), subStr.end(), subStr.begin(), ::tolower);
    return str.find(subStr, loc);
}

void hasOccuredAtIndex(std::vector<size_t> &vec, std::string str, std::string subStr)
{

    // Adding the first occurence of the substring to the vector
    size_t loc = modifiedFind(str, subStr);
    while (loc != std::string::npos)
    {
        vec.push_back(loc);
        //Finding and adding the ext occurence of the substring
        loc = modifiedFind(str, subStr, loc + subStr.size());
    }
}

int main(int argc, char const *argv[])
{
    std::string str = "We are going through an example. we will be seeing how many times the word \'We\' occurs";
    std::string subStr = "We";
    std::vector<size_t> vec;
    hasOccuredAtIndex(vec, str, subStr);
    //The string and substring were passed with a vector which will store the indices of occurence
    std::cout << "The indices where the string \"" << subStr << "\" has occured" << std::endl;
    for (size_t loc : vec)
        std::cout << loc << std::endl;
    return 0;
}
Output :
The indices where the string "We" has occured
0
33
76

Now we can see the modified program has become case insensitive and displays all the occurrences of our substring.