将 JavaScript split()-slice()-join() 序列转换为 C++

Posted

技术标签:

【中文标题】将 JavaScript split()-slice()-join() 序列转换为 C++【英文标题】:Convert JavaScript split()-slice()-join() sequence to C++ 【发布时间】:2014-01-16 19:10:35 【问题描述】:

javascript 中,如果我们有一个带分隔符的字符串,我们可以这样删除前导项:

console.log(('/dev/input/event11').split('/').slice(2).join('/'))

输出:input/event11

如何在 C++ 中做到这一点?

【问题讨论】:

Parse (split) a string in C++ using string delimiter (standard C++) 的可能重复项 【参考方案1】:

这个答案并没有以同样的方式解决问题。我认为将整个字符串拆分为一个数组,然后重新组合同一个数组但缺少第一个元素的效率并不高。那么为什么不简单地找到'/'的第二次出现呢?怀着这样的想法:

#include <string>
#include <iostream>

using namespace std;

int main(int argc,char *argv[])

   string s = "/dev/input/event11";
   int index = 0,num_slash = 0;

   for(string::iterator i = s.begin();i != s.end() && num_slash < 2;i++,index++)
   
      if(*i == '/') num_slash++;
   
   cout << s.substr(index) << endl;

【讨论】:

逻辑是有道理的,但你是在重新发明***。【参考方案2】:

基于waTeim的思想,但使用标准函数:

int main()

   string s = "/dev/input/event11";
   // Find second slash.
   int num_slash = 0;
   auto iter = std::find_if(begin(s), end(s), 
      [&](char c)  if(c=='/') ++num_slash; return num_slash==2; );
   if (iter != end(s) ++iter; // Don't include second /
   std::cout << std::string(iter, end(s));

或者(不那么灵活)

int main()

   string s = "/dev/input/event11";
   auto iter = std::find(begin(s), end(s), '/');
   if (iter != end(s)) 
      iter = std::find(++iter, end(s), '/');
      if (iter != end(s) 
         std::cout << std::string(++iter, end(s));
      
   

【讨论】:

以上是关于将 JavaScript split()-slice()-join() 序列转换为 C++的主要内容,如果未能解决你的问题,请参考以下文章

SLIC超像素(superpixel)算法

JavaScript中split函数

SLIC超像素分割详解(一):简介

将 JavaScript split()-slice()-join() 序列转换为 C++

javascript中split字符串分割函数

youcans 的 OpenCV 例程200篇171.SLIC 超像素区域分割