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 astd::vector<char> alphabets
or even a singlestd::string
as youralphabets
containes/ representschar
s as strings. In the case ofstd::string
s (i.e.alphabets
), thestd::basic_string::find
is more appropriate to use, rather than having more generalstd::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 calledstd::erase_if
.
In
std::find(alphabets.begin(), alphabets.end(), *it);
alphabets.begin()
and alphabets.end()
are std::vector
of std::string
s 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);
}
}