Andy‘s First Dictionary 跳过非字母、转小写、排序

完整代码

#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) : ' ';
        }
  1. for (char &c : s) { ... }: 这是一个范围基础 for 循环,用于遍历字符串 s
    • char &c 表示 cs 中当前字符的引用。由于它是引用,对 c 的任何修改都会影响 s 中对应的字符。
  2. c = isalpha(c) ? tolower(c) : ' ';: 这是一个三元操作符,用于条件转换。
    • isalpha(c) 检查 c 是否是一个字母(无论大写或小写)。
    • 如果 c 是一个字母,tolower(c) 会把它转换为小写。
    • 如果 c 不是一个字母,它会被替换为一个空格 ' '
        stringstream ss(s);
        while (ss >> buf) {
            dict.insert(buf);
        }
  1. stringstream ss(s);:这里创建了一个名为 ssstringstream 对象,并用字符串 s 对其进行初始化。此时,ss 内部包含了 s 的内容。

  2. while (ss >> buf): 在这个循环里,ss 的内容会被逐词(按空格、换行符、制表符等分隔)读入到字符串 buf 中。

    • >> 是一个输入操作符,它会从 ss 中读取并跳过任何前导的空白字符(比如空格或者换行符),然后读取接下来的连续的非空白字符,直到再次遇到空白字符或字符串结束。

    • 这个操作会持续进行,直到 ss 中没有更多的词可以读取。

  3. dict.insert(buf);:这里将 buf 的内容插入到一个 set 中,该 set 的名字是 dict。因为 set 会自动进行排序并且不会插入重复项,所以最后 dict 会包含所有唯一的、排序过的词。

    for(const auto& str: dict)
    {
        cout<<str<<endl;
    }
  1. const auto& str: 在每次循环迭代中,str 会绑定到 dict 中的一个元素。

    • const:不允许修改元素的值。
    • auto:让编译器自动推断元素的类型,这里是 std::string
    • &:表示引用,避免复制字符串。
  2. :: 之后是你要遍历的容器,这里是 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 函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值