Delete elements in a std::vector<std::string> which matches with the characters in another given std::string

The *it has a type of char not std::string. This is what the compiler complaining about. Therefore you need to pass a std::string to the std::find as follows.

auto toErase = std::find(alphabets.begin(), alphabets.end(), std::string{ *it });
 //                                                          ^^^^^^^^^^^^^^^^^^

Here is a demo.


Also, note the followings:

  • You can change the std::vector<std::string> alphabets to a std::vector<char> alphabets or even a single std::string as your alphabets containes/ represents chars as strings. In the case of std::strings (i.e. alphabets), the std::basic_string::find is more appropriate to use, rather than having more general std::find at first place.
  • For vector erase, you could use erase–remove idiom, or since C++20, using non-member function of std::vector itself, so called std::erase_if.

In

std::find(alphabets.begin(), alphabets.end(), *it);

alphabets.begin() and alphabets.end() are std::vector of std::strings iterators, but it is a std::string iterator, it iterates over characters, these arguments are incompatible, the can't be used together in std::find without some kind of conversion.

That said a better way to correct your code would be to turn your alphabets container, which is overly complicated, from std::vector<std::string> into a simple std::string.

Live demo

//init
std::string alphabets{"abcdefghiklmnopqrstuvwxyz"}; //<--- simple string

//input
std::string plaintext;
std::cout << "enter plain text: ";
std::cin >> plaintext;

for (std::string::iterator it = plaintext.begin(); it != plaintext.end(); it++)
{
    std::string::iterator toErase; //<--- string iterator
    /*or auto */ toErase = std::find(alphabets.begin(), alphabets.end(), *it);
    if (toErase != alphabets.end())
    {
        alphabets.erase(toErase);
    }
}

This is what I understood:
You have a string say str1. Now you've been given another string say, str2. Now you want to delete all characters from str1, which are present in str2.

In that case, I suggest scanning the input as a string instead of vector, and then using the delete loop

for(auto it = str1.begin(); it != str1.end(); it++) {
    if(str2.find(std::string{*it}) != std::string::npos) {
        it = str1.erase(it);
    }
}