【问题标题】:Is there a clean way to split comma-and-space--separated words using ranges?有没有一种干净的方法来使用范围拆分逗号和空格分隔的单词?
【发布时间】:2021-07-28 00:24:52
【问题描述】:

我实际上是从 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,a,o],[i,a,o]]
  std::cout << (vs | transform(trim(is('c')))) << std::endl;

  // doesn't work
  //auto result0 = split_when(s, is(',')) | transform(trim(is(' ')));
  //auto result1 = transform(split_when(s, is(',')), 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(' ')));

但事实并非如此。

【问题讨论】:

  • 单词也可以用空格分隔吗?如果没有,你可以分裂两次。
  • @cigien,你能举个例子吗?
  • 我在想split(' ') | join | split(',') 之类的东西,但我刚试了一下,那个例子不起作用。
  • 为什么不使用ranges::for_each 并删除(擦除)空间然后使用split_when()
  • 点赞this ;)

标签: c++ functional-programming c++17 range-v3 std-ranges


【解决方案1】:

split 可以拆分超过一个元素的模式。需要注意的是", ",被认为是一个范围,是三个元素的模式(包括终止的空字符)——无论如何,适配器将它衰减为一个指针,这使得它不是一个范围。所以:

auto result = input | rv::split(", "sv);

【讨论】:

  • 这很优雅;我忘了 split 可以取一个范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多