如何解决有没有一种干净的方法来使用范围分割逗号和空格分隔的单词?
我实际上是根据 a deleted question from yesterday 改编的。
输入:一个字符串,包含逗号分隔的单词,逗号后有空格。
输出:单词。
我所说的“干净”是指不依赖于根据代码的意图将临时变量存储到没有理由存在的变量中的东西。
我的尝试
#include <iostream>
#include <range/v3/view/split.hpp>
#include <range/v3/view/split_when.hpp>
#include <range/v3/view/transform.hpp>
#include <range/v3/view/trim.hpp>
#include <string>
#include <vector>
auto constexpr is = [](char c){
return [c](char c_){ return c_ == c; };
};
using namespace ranges::views;
int main()
{
std::string ss{"cccccciao"};
// correctly prints [i,a,o]
std::cout << (ss | trim(is('c'))) << std::endl;
std::string s = "blue,green,red";
std::cout << split_when(s,is(',')) << std::endl;
std::vector<std::string> vs;
vs.push_back(ss);
vs.push_back(ss);
// correctly prints [[i,o],[i,o]]
std::cout << (vs | transform(trim(is('c')))) << std::endl;
// doesn't work
//auto result0 = split_when(s,')) | transform(trim(is(' ')));
//auto result1 = transform(split_when(s,')),trim(is(' ')));
// doesn't work either
auto sss = split_when(s,[](char c){ return c == ','; });
//auto result2 = transform(sss,trim([](char c){ return c == ' '; }));
//auto result3 = sss | transform(trim([](char c){ return c == ' '; }));
}
基于 principle of least astonishment 我希望像这样的 oneliner 应该可以工作,
auto result0 = s | split_when(is(',')) | transform(trim(is(' ')));
但它没有。
解决方法
fn
可以在长度超过一个元素的模式上进行拆分。一个警告是,被视为范围的 index.js#394
是一种包含三个元素(包括终止空字符)的模式 - 在任何情况下,适配器都会将其衰减为一个指针,这使得它不是一个范围.所以:
split
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。