C++ reverse_copy(STL reverse_copy)算法详解
下面是一个使用 reverse_copy() 和 copy_if() 的示例:
这个程序会检查一条语句(也可以是很多条语句)是否是回文的。回文语句是指正着读或反着读都相同的句子,前提是忽略一些像空格或标点这样的细节。while 使我们可以检查尽可能多的句子。用 getline() 读一条句子到 sentence 中。如果读到// Testing for palindromes using reverse_copy()
#include <iostream> // For standard streams
#include <iterator> // For stream iterators and begin() and end()
#include <algorithm> // For reverse_copy() and copy_if()
#include <cctype> // For toupper() and isalpha()
#include <string>
using std::string;
int main()
{
while(true)
{
string sentence;
std::cout << "Enter a sentence or Ctrl+Z to end: ";
std::getline(std::cin, sentence);
if(std::cin.eof()) break;
// Copy as long as the characters are alphabetic & convert to upper case
string only_letters;
std::copy_if(std::begin(sentence), std::end(sentence), std::back_inserter(only_letters),[](char ch) { return std::isalpha(ch); });
std::for_each(std::begin(only_letters), std::end(only_letters), [](char& ch) { ch = toupper(ch); });
// Make a reversed copy
string reversed;
std::reverse_copy(std::begin(only_letters), std::end(only_letters), std::back_inserter(reversed));
std::cout << '"' << sentence << '"'<< (only_letters == reversed ? " is" : " is not") << " a palindrome." << std::endl;
}
}
Ctrl+Z,输入流中会设置 1 个EOF标志,它会结束循环。用 copy_if() 将 sentence 中的字母到 only_letters。这个 lambda 表达式只在参数是学母时返回 true,所以其他的任何字符都会被忽略。然后用 back_inserter() 生成的 back_insert_iterator 对象将这些字符追加到 only_letter。for_each() 算将三个参数指定的函数对象应用到前两个参数定义的序列的元素上,因此这里会将 only_letters 中的字符全部转换为大写。然后用 reverse_copy() 算法生成和 only_letters 的内容相反的内容。比较 only_letters 和 reversed 来判断输入的语句是否为回文。
该程序的输出结果为:
Enter a sentence or Ctrl+Z to end: Lid off a daffodil.
"Lid off a daffodil." is a palindrome.
Enter a sentence or Ctrl+Z to end: Engaga le jeu que je le gagne.
"Engaga le jeu que je le gagne." is not a palindrome.
Enter a sentence or Ctrl+Z to end: ^Z
reverse() 算法可以在原地逆序它的两个双向迭代器参数所指定序列的元素。可以如下 所示用它来代替上述程序中的 reverse_copy():这两条语句会替换上述程序中 reversed 的定义和 reverse_copy() 调用。它们生成一个 only_letters 的副本 reversed,然后调用 reverse() 原地逆序 reversed 中的字符序列。string reversed {only_letters};
std::reverse(std::begin(reversed), std::end(reversed));
- 随机文章
- 国青 战平 马尔代夫(国青战平马尔代夫,发挥不尽如人意)
- 高尔夫马尔代夫蓝(高尔夫新天堂:马尔代夫的蔚蓝球场)
- 悉尼-马尔代夫(澳大利亚悉尼至马尔代夫的直飞航线开通)
- 马尔代夫送什么(马尔代夫礼品推荐)
- 来宾 凤凰 马尔代夫(凤凰酒店集团落户马尔代夫,将新开豪华度假村)
- 信阳马尔代夫老板(信阳企业家投资建设马尔代夫主题公园)
- 小费 马尔代夫(马尔代夫旅行小费指南)
- 微商马尔代夫日常(马尔代夫微商生活日常,简单轻松赚钱)
- 国足 马尔代夫 比赛时间(国足将在马尔代夫进行比赛,时间已定!)
- 最美的海马尔代夫(探秘海马尔代夫,享受最佳旅行体验!)
- 海沟 马尔代夫(深海探秘:揭秘马尔代夫神秘海沟)
- 潭头 马尔代夫(重返蓝色梦境:潭头探秘马尔代夫)
- 水床 马尔代夫(马尔代夫度假新玩法:水床体验!)
- 地名 马尔代夫 Male 039(马尔代夫首都Male回归日常,游客逐渐增多)
- 双人马尔代夫费用(双人梦幻马尔代夫:旅行所需费用一览)
- 玉林马尔代夫草莓(玉林草莓出口马尔代夫,惊艳当地市场)
- 韩国马尔代夫美女(韩国美女游马尔代夫享受浪漫海岛风情)
- 苹果马尔代夫壁纸(美丽马尔代夫风景成为苹果新壁纸来源)
- 芙拉瓦西马尔代夫(芙拉瓦西岛:马尔代夫的绝美度假天堂)
- 焦作 马尔代夫(焦作市民可以直接乘飞机前往马尔代夫啦!)
- 马尔代夫不去岛上(马尔代夫游客新选择:沙滩露营体验!)
- 马尔代夫低价陷阱(警惕!马尔代夫游客陷入低价诈骗陷阱)
- 郑智 马尔代夫(郑智领衔广州恒大赴马尔代夫备战新赛季)
- 玉林马尔代夫烧烤(玉林市民在马尔代夫品尝正宗烧烤风味)
- 马尔代夫关税弊端(探讨马尔代夫关税制度的缺陷及影响。)
- 马尔代夫做法教程(学习如何制作马尔代夫特色菜肴的教程)
- 西安马尔代夫旅游(探索西安最新旅游热点:马尔代夫风情)
- 马尔代夫印度美食(探索马尔代夫印度口味:畅享美食之旅)
- 马尔代夫充电插孔(后的:马尔代夫新型充电插孔简化旅行)
- 马尔代夫夜景夜市(重温马尔代夫之夜,独特夜市惊艳再现)
