完整代码
#include <iostream>
#include <set>
#include <algorithm>
#include <sstream>
#include <cctype> // For tolower() function
using namespace std;
int main() {
//在windows平台,一般模拟eof的输入是在一个新行的开头输入ctrl + z就行了
//在unix环境下,是在一个新行的开始出输入ctrl + D就可以了
ios::sync_with_stdio(false);
string s,buf;
set<string> dict;
while (cin >> s) {
for (char &c : s) {
c = isalpha(c) ? tolower(c) : ' ';
}
stringstream ss(s);
while (ss >> buf) {
dict.insert(buf);
}
}
for(const auto& str: dict)
{
cout<<str<<endl;
}
}
关键代码解释
for (char &c : s) {
c = isalpha(c) ? tolower(c) : ' ';
}
for (char &c : s) { ... }
: 这是一个范围基础 for 循环,用于遍历字符串s
。char &c
表示c
是s
中当前字符的引用。由于它是引用,对c
的任何修改都会影响s
中对应的字符。
c = isalpha(c) ? tolower(c) : ' ';
: 这是一个三元操作符,用于条件转换。isalpha(c)
检查c
是否是一个字母(无论大写或小写)。- 如果
c
是一个字母,tolower(c)
会把它转换为小写。 - 如果
c
不是一个字母,它会被替换为一个空格' '
。
stringstream ss(s);
while (ss >> buf) {
dict.insert(buf);
}
-
stringstream ss(s);
:这里创建了一个名为ss
的stringstream
对象,并用字符串s
对其进行初始化。此时,ss
内部包含了s
的内容。 -
while (ss >> buf)
: 在这个循环里,ss
的内容会被逐词(按空格、换行符、制表符等分隔)读入到字符串buf
中。-
>>
是一个输入操作符,它会从ss
中读取并跳过任何前导的空白字符(比如空格或者换行符),然后读取接下来的连续的非空白字符,直到再次遇到空白字符或字符串结束。 -
这个操作会持续进行,直到
ss
中没有更多的词可以读取。
-
-
dict.insert(buf);
:这里将buf
的内容插入到一个set
中,该set
的名字是dict
。因为set
会自动进行排序并且不会插入重复项,所以最后dict
会包含所有唯一的、排序过的词。
for(const auto& str: dict)
{
cout<<str<<endl;
}
-
const auto& str
: 在每次循环迭代中,str
会绑定到dict
中的一个元素。const
:不允许修改元素的值。auto
:让编译器自动推断元素的类型,这里是std::string
。&
:表示引用,避免复制字符串。
-
:
: 之后是你要遍历的容器,这里是dict
。
把大写转小写的另一种方式transform
transform(s.begin(),s.end(),s.begin(), ::tolower);
c++中transform函数的应用_726。的博客-CSDN博客transform函数的应用作用transform函数的作用是:将某操作应用于指定范围的每个元素。transform函数有两个重载版本:transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class。transform(first1,last1..._transform函数https://blog.csdn.net/weixin_43750730/article/details/89287165
::的作用
在 C++ 中,::
是作用域解析运算符。在这个特定的例子里,::tolower
表示我们要使用全局作用域下的 tolower
函数。
如果你不加 ::
,编译器会首先在当前作用域(在这个例子中是 main
函数内部)和当前使用的命名空间(由于有 using namespace std;
,所以包括 std
命名空间)里查找 tolower
函数。如果在这些地方找不到,编译器才会去全局作用域里查找。
使用 ::
是一种明确的方式来告诉编译器,我们要使用的是全局作用域中的 tolower
函数,而不是其他可能存在于当前作用域或 std
命名空间中的同名函数。
这么做有时候是很有用的,特别是当全局作用域和当前作用域中都有同名的函数或变量时,使用 ::
可以消除歧义。
简单来说,::tolower
确保我们使用的是全局作用域中定义的 tolower
函数。