有没有一种方法可以将字符串插入字符集? C ++

时间:2020-04-16 09:44:51

标签: c++ string char set

我有一个字符串“ {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 个答案:

答案 0 :(得分:3)

std::set::insert有一个重载,它需要两个迭代器来插入一系列元素,并且要删除字符串中不需要的字符,可以使用“擦除删除惯用语”(例如,参见here) 。我本可以使用remove_if一次性删除所有内容,但是对于一串较小的字符串,最好使其保持简单。

#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());

最后但并非最不重要的一些建议:

答案 1 :(得分:2)

您可以遍历字符串并将每个字符插入集合:

#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();    
}

但是,不必编写循环以插入到设置的容器中。一种更简单的方法是将std::set::insert()与两个迭代器位置一起使用,如@ idclev463035818所述,或者在声明时使用构造函数直接构造该集合。

将循环方法视为替代方法。

此外,如果要从字符串的特定部分获取元素,则可以更改迭代器的位置。 (循环也可以,但前者包含较短的代码)

请记住,集合包含不同的元素,因此仅插入唯一的元素,并相应地说明总大小。


编辑:

基于具有除字母之外的字符的字符串,您的要求是仅采用字母(在示例中为a,b,c和d),则可以使用issalpha()

一种更通用的方法,即只包含您想要的字符(甚至包括字母或任何其他字符),之后可以创建一个函数(布尔类型),该函数区分那些字符并将相同的信息提供给{{1} }(包括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(); }