我有一个字符串“ {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
答案 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();
}