将 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++的主要内容,如果未能解决你的问题,请参考以下文章