c++ - 返回字符串中的最后一个元音

标签 c++

我需要返回给定字符串中的最后一个元音(大写或小写)并返回 '!'如果字符串中没有任何元音。

我写的代码有效,但前提是字符串以元音结尾。如果它不以元音结尾,它总是返回一个 '!'。

我该如何解决这个问题?

char lastVowel(string s){

    char vowel = ' ';

    for(int i = 0; i < s.size(); ++i){
        if(s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U' ||
           s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u'){
            vowel = s[i];
        }else{
            vowel = '!';
        }
    }
    return vowel;
}

最佳答案

这非常简单,只需两行即可完成:

#include <string>

char lastVowel(std::string s) {
    const auto pos = s.find_last_of("aeiouAEIOU");
    return pos == std::string::npos ? '!' : s[pos];
}

您还可以std::transform 将字符串转换为小写并将搜索缩短为aeiou,但我尚未测试这是否会影响性能。

编辑:

我刚测试过。对于大 N(100,000 个字符串),使用 std::transform 大约慢 158 倍。

不要先将您的字符串转换为一种或另一种大小写。将搜索条件加长会快得多。

关于c++ - 返回字符串中的最后一个元音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66876806/

相关文章:

c++ - Qt从控制台读取并按Enter停止

c++ - 在 C++ 中将 rand() 结果写入文本文件而不重复数字

c++ - 是否有用于使用 gcc 构建 MS Visual C++ Express 的免费开源工具?

c++ - 避免在写入文件时覆盖现有文件的内容

c++ - 修改顺序是否有助于 happens-before 关系?

c++ - 获取指向 lambda 的函数指针?

c++ - 如何删除字符串中的单个字符并在字符串中使用递归

c++ - 在 VS 2013 中使用初始化列表初始化 map 的 map

c++ - i < N+1 和 i <= N 不同吗?

c++ - 如何在 C++ 中将函数作为可选参数传递?