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

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

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

输出:input/event11

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

【问题讨论】:

标签: javascript c++ arrays string split


【解决方案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));
      }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 2022-06-11
    • 1970-01-01
    • 2014-08-08
    • 2020-04-30
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多