Вы можете пройти через строку и вставить каждый символ в набор:
#include <iostream>
#include <set>
int main()
{
std::string text;
std::cin>> text;
std::set<char> yeet;
for(char c:text)
yeet.insert(c);
std::cout<< yeet.size();
}
Однако нет необходимости писать al oop для вставки в контейнер набора. Намного проще было бы использовать std::set::insert()
с двумя позициями итератора, как упомянуто @ idclev463035818, или напрямую создавать набор во время объявления с использованием конструктора.
Рассмотреть подход l oop в качестве альтернативы .
Кроме того, вы можете изменить позиции итератора, если хотите получить элементы из указанных c частей строки. (l oop тоже работает, но первый включает более короткий код)
Помните, что набор содержит отдельные элементы, поэтому будут вставлены только уникальные элементы и, соответственно, общий размер.
Редактировать:
На основе строки, содержащей символы, отличные от алфавитов, при этом вы должны указывать только буквы алфавита (a, b, c и d в вашем пример) вы можете использовать issalpha()
.
Более общий подход c, включающий только желаемый символ (даже алфавит или любой символ в целом), после которого можно создать функцию (логического типа) ), который различает эти символы и предоставляет ту же информацию для std::remove_if
(включая <algorithm>
), чтобы стереть эти элементы (опять же, после erase-remove-idiom ) через std::erase
из вашей строки :
bool IsValid(char c) { return(c == '{' || c == '}' || c == ',' || c == ' '); }
Рабочий пример:
#include <iostream>
#include <set>
#include <algorithm>
bool IsValid(char c) { return(c == '{' || c == '}' || c == ',' || c == ' '); }
int main()
{
std::string text = {"{a, b, c, d}"};
text.erase(std::remove_if(text.begin(), text.end(), IsValid), text.end());
std::set<char> yeet(text.begin(),text.end());
std::cout << yeet.size();
}
Выход: 4