生成使用升压

问题描述:

令牌的适当数量的我有一个代码如下生成使用升压

std::string some_string = "-0.003 79350 -0.267 147"; 
boost::algorithm::trim (some_string); 
//std::cout << some_string << std::endl; 
boost::tokenizer<> tok(some_string); 
const auto n = std::distance(tok.begin(), tok.end()); 
std::cout << n << std::endl; 

我希望有令牌的数量为4,但它给6。任何建议,将不胜感激。谢谢。

以下代码根据需要输出4。

#include<iostream> 
#include<string> 
#include<boost/tokenizer.hpp> 

int main() { 
    std::string s = "-0.003 79350 -0.267 147"; 
    boost::tokenizer<boost::char_separator<char> > tok(s, boost::char_separator<char>(" ")); 
    const auto n = std::distance(tok.begin(), tok.end()); 
    std::cout << n << std::endl; 
} 

Coliru上的相同代码是here

+0

我不得不downvote你'使用命名空间std;' – Puppy 2015-04-01 11:50:12

+0

@Puppy其实我主要是关于它结合了'使用命名空间std'和事实感到惊讶'使用命名空间boost'这是一个非常糟糕的主意。这也可能是后续代码中名称空间仍然合格的原因... – sehe 2015-04-01 11:54:34

+0

@Puppy,代码已修复。 – megabyte1024 2015-04-01 11:59:24

无需提升,也更正确。

这是更正确的假设,你其实是想如果你想保留的令牌,而不是仅仅解析数字解析数

Live On Coliru

#include <iostream> 
#include <sstream> 
#include <iterator> 

int main() { 
    std::istringstream some_string ("-0.003 79350 -0.267 147"); 
    std::cout << std::distance(std::istream_iterator<double>(some_string), {}); 
} 

更新

Live On Coliru

istringstream s("-0.003 79350 -0.267 147"); 

vector<string> vec(istream_iterator<string>(s), {}); 

cout << vec.size(); 
+0

我必须使用令牌以供进一步使用该字符串可能并不总是包含数字。所以,我遵循@ megabyte1024的答案。你的回答很好。 – Launa 2015-04-01 12:14:01

+0

@Launa这就是为什么一个很好的例子在你的代码中很重要:)看看我的编辑。 (也** [Live](http://coliru.stacked-crooked.com/a/e798895ad8d3af78)**) – sehe 2015-04-01 12:26:52

+0

您的回答是有用的。但是,我没有获得投票的特权:) – Launa 2015-04-01 12:41:39