Есть ли способ вставить строку в набор символов? C ++ - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть строка "{a, b, c, d}", и я хочу взять буквы в этой строке и поместить их в набор, содержащий эти буквы, а затем вывести его размер. Я пытался сделать код, но он выдал бы ошибку.

#include <bits/stdc++.h>
using namespace std;

string text;
set <char> yeet;

int main()
{
    cin >> text;

    yeet.insert(text);

    cout << yeet.size();
}

Ввод:

{a, b, c, d}

Вывод:

4

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

std::set::insert имеет перегрузку, которая переводит два итератора в диапазон элементов, которые нужно вставить, и для удаления нежелательных символов в строке вы можете использовать erase-remove-idiom (см., Например, здесь ). Я мог бы использовать remove_if, чтобы удалить все в одном go, но для строки небольшого размера лучше сохранить простоту.

#include <string>
#include <set>
#include <iostream>
#include <algorithm>

int main()
{
    std::string text{"{a, b, c, d}"};

    text.erase(std::remove(text.begin(), text.end(), '{'), text.end()); 
    text.erase(std::remove(text.begin(), text.end(), '}'), text.end()); 
    text.erase(std::remove(text.begin(), text.end(), ','), text.end()); 
    text.erase(std::remove(text.begin(), text.end(), ' '), text.end()); 
    std::set<char> yeet;            

    yeet.insert(text.begin(),text.end());

    std::cout << yeet.size();
}

Вывод:

4

Примечание что если вы хотите построить set из всех символов в string, вы можете использовать вместо этого конструктор:

std::set<char> yeet(text.begin(),text.end());

Последние, но не менее важные рекомендации:

2 голосов
/ 16 апреля 2020

Вы можете пройти через строку и вставить каждый символ в набор:

#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

...