前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >判断回文字符串,一句话就够了!

判断回文字符串,一句话就够了!

作者头像
用户9831583
发布2022-06-16 15:28:58
3590
发布2022-06-16 15:28:58
举报
文章被收录于专栏:码出名企路

先看代码:

代码语言:javascript
复制
#include <iostream>                                    
   #include <iterator>                                      
   #include <algorithm>                                    
   #include <cctype>                                        
   #include <string>
   using std::string;
   int main()
{  
       //检查一条语句(也可以是很多条语句)是否是回文的
       while(true)
      {
           string sentence;
           std::cout << "Enter a sentence or Ctrl+Z to end: ";
           //etline() 读一条句子到 sentence 中
           std::getline(std::cin, sentence);
           if(std::cin.eof()) break;
           
           string only_letters;
           // copy_if() 将 sentence 中的字母复制到 only_letters
           //只在参数是字母时返回 true,所以其他的任何字符都会被忽略
           std::copy_if(std::begin(sentence), std::end(sentence), std::back_inserter(only_letters),
                  [](char ch) { return std::isalpha(ch); });

           //or_each() 算法会将三个参数指定的函数对象应用到前两个参数定义的序列的元素上      
           //将 only_letters 中的字符全部转换为大写
           std::for_each(std::begin(only_letters), std::end(only_letters),
                    [](char& ch) { ch = toupper(ch); });
         
           string reversed;
           //用 reverse_copy() 算法生成和 only_letters 的内容相反的内容
           std::reverse_copy(std::begin(only_letters), std::end(only_letters), std::back_inserter(reversed));

           //或者以下代替
          // string reversed{only_letters};
          // std::reverse(std::begin(reversed), std::end(reversed));

           //比较 only_letters 和 reversed 来判断输入的语句是否为回文。
           std::cout << '"' << sentence << '"'<< (only_letters == reversed ? " is" : " is not") << " a palindrome." << std::endl;
      }
  }
结果显示:
相关函数解析:
1.copy_n()

copy_n() 算法可以从源容器复制指定个数的元素到目的容器中。

参数定义:第一个参数是指向第一个源元素的输入迭代器,第二个参数是需要复制的元素的个数,第三个参数是指向目的容器的第一个位置的迭代器。

返回值:返回一个指向最后一个被复制元素的后一个位置的迭代器。

2.copy_if()

从源序列复制使谓词返回 true 的元素,把它看作一个过滤器。

参数定义:前两个参数定义源序列的输入迭代器,第三个参数是指向目的序列的第一个位置的输出迭代器,第 4 个参数是一个谓词。

返回值:返回一个输出迭代器,它指向最后一个被复制元素的下一个位置。

3.copy_backward()

像 copy() 那样复制元素,但是从最后一个元素开始直到第一个元素。

参数定义:复制前两个迭代器参数指定的序列。第三个参数是目的序列的结束迭代器,通过将源序列中的最后一个元素复制到目的序列的结束迭代器之前,源序列会被复制到目的序列中。

图 说明了源序列 from 的最后一个元素是如何先被复制到目的序列 to 的最后一个元素的。

  1. 从源序列的反向,每个元素依次复制到目的序列的前一个元素之前的位置。
  2. 在进行这个操作之前,目的序列中的元素必须存在,因此目的序列至少要有和源序列一样多的元素,但也可以有更多。
  3. 返回一个指向最后一个被复制元素的迭代器,在目的序列的新位置,它是一个开始迭代器。

1-2-3代码实例:

代码语言:javascript
复制
    #include <iostream>                                    
    #include <vector>                                      
    #include <algorithm>                                    
    #include <string>                                        
    #include <iterator>  
    #include <string>
    #include <deque>
using namespace std;
  
  using std::string;

  int main()
  {
    std::vector<string> names {"A1","Beth", "Carol", "Dan", "Eve","Fred","George" ,"Harry", "Iain", "Joe"};
    std::vector<string> more_names {"Janet", "John"};
    //从 names 的第二个元素开始复制 3 个元素到关联容器 more_names 中
    std::copy_n(std::begin(names)+1, 3, std::inserter(more_names, std::begin(more_names)));
    
    //输出 more_names 中除了最后一个元素之外的全部元素
    std::copy_n(std::begin(more_names), more_names.size()-1,std::ostream_iterator<string> {std::cout, " "});
    cout<<endl;

    //copy_if
    size_t max_length{4};
    //复制 names 中的 4 个字符串或更少
    std::copy_if(std::begin(names), std::end(names), std::inserter(more_names, std::begin(more_names)),
         [max_length](const string& s) { return s.length() <= max_length;});
    std::copy(std::begin(more_names), std::end(more_names), std::ostream_iterator <string>{std::cout, " "});
    std::cout << std::endl;

    //copy_if() 的目的容器也可以是一个流迭代器
    // names 容器中包含的含有 4 个以上字符的名称写到标准输出流中
   std::copy_if(std::begin(names), std::end(names), std::ostream_iterator< string> {std::cout," "},
                 [max_length](const string& s) { return s.length() > max_length; });
   std::cout << std::endl;


   //只有当从标准输入流读取的姓名的长度小于或等于 4 个字符时,copy_if() 算法才会复制它们
    std::cout << "Enter names of less than 5 letters. Enter Ctrl+Z on a separate line to end:\n";
    std::copy_if(std::istream_iterator<string>{std::cin},std::istream_iterator<string>{},
                std::inserter(names, std::begin (names)),
                        [max_length](const string& s) { return s.length() <= max_length; });
    std::copy(std::begin(names), std::end(names), std::ostream_iterator <string>{std::cout," "});
    std::cout << std::endl;


    //copy_backward
    //将原有的元素复制到向右的两个位置,保持前两个元素不变
     std::deque<string> song{ "jingle", "bells","jingle", "all", "the", "way"};
    song.resize(song.size()+2);
    std::copy_backward(std::begin(song), std::begin(song)+6, std::end(song));
    std::copy(std::begin(song), std::end(song), std::ostream_iterator <string> {std::cout, " "});
    std::cout << std::endl;

  }

结果显示:

4.reverse_copy()

将源序列复制到目的序列中,目的序列中的元素是逆序的。

参数定义:目的序列由第三个参数指定,它是目的序列的开始迭代器,也是一个输出迭代器。

返回值:返回一个输出迭代器,它指向目的序列最后一个元素的下一个位置。

5.unique()

可以在序列中原地移除重复的元素,要求被处理的序列必须是正向迭代器。

返回值:在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器。参数定义:可以提供一个函数对象作为可选的第三个参数,这个参数会定义一个用来代替 == 比较元素的方法。

实例代码:

代码语言:javascript
复制
   #include <iostream>                                    
    #include <iterator>                                      
    #include <algorithm>                                    
    #include <cctype>                                        
    #include <string>
    using std::string;
    int main()
    {  

        //通过覆盖来消除 words 中的连续元素
        std::vector<string> words {"one", "two", "two", "three", "two", "two", "two"};
        auto end_iter = std::unique(std::begin(words), std::end(words));
        // erase() 会移除新的结束迭代器之后的所有元素,因此 end(words) 会返回 end_iter
        words.erase(end_iter, std::end(words));
        std::copy (std::begin (words) , std::end (words) , std::ostream_iterator<string> {std::cout, " "});
        std::cout << std::endl;

        // unique() 会移除字符串 text 中的连续重复的空格
        //在没有重复元素的新字符串之后的所有字符都会被移除。
        string text {"There's   no air in   spaaaaaace!"};
        text.erase(std::unique(std::begin(text), std::end(text),
                [](char ch1, char ch2) { return ch1 = ' '&& ch1 == ch2; }), std::end(text));
        std::cout << text << std::endl; // Outputs: There's no air in spaaaaaace!
    }

结果显示:


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结果显示:
  • 相关函数解析:
  • 1.copy_n()
  • 2.copy_if()
  • 3.copy_backward()
  • 4.reverse_copy()
  • 5.unique()
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档