我想将字符串解析为整数向量:
string s = "1;2;4;8;16;";
vector<int> n = parse_string(s);
// n == [1, 2, 4, 8, 16];
当然,我可以使用strtok
和atoi
编写一个简单的代码。但是,用C ++提升会有什么更短的代码呢?我从来没有尝试使用Boost,但听说它可能只是你的代码就像使用Python一样。
答案 0 :(得分:3)
可以在没有Boost的情况下完成:
string s = "1;2;4;8;16";
vector<int> n;
transform(s.begin(), s.end(), [](char c){return c == ';' ? ' ' : c});
stringstream ss(s);
copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(n));
修改强>: 如果你只想使用C ++ 03代码,你必须写:
char semicolon_to_space(char c){
return c == ';' ? ' ' : c
};
// ...
string s = "1;2;4;8;16";
vector<int> n;
transform(s.begin(), s.end(), semicolon_to_space);
stringstream ss(s);
copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(n))
答案 1 :(得分:0)
我认为在这种情况下应该使用2个单独的算法。第一个将是一个解析器,它将你的值分开boost :: split http://www.boost.org/doc/libs/1_48_0/doc/html/string_algo/reference.html#header.boost.algorithm.string.split_hpp应该有帮助。第二个将是词法转换,它将你的字符串整数转换为int值,看看boost :: lexical_cast&lt;&gt;。
答案 2 :(得分:0)
我不是一个提升profi,所以我的代码不理想:
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/foreach.hpp>
#include <iostream>
#include <vector>
#include <string>
int main()
{
using namespace boost::algorithm;
std::vector< std::string > result;
split(result, "1;2;4;8;16;", is_any_of(";"));
BOOST_FOREACH(const std::string& item, result)
{
std::cout << item << std::endl;
}
}
你肯定可以处理is_any_of
答案 3 :(得分:-1)
嗯boost::tokenizer
?想知道我是否遗漏了什么,但对于这个应用程序来说不是那么理想吗?
http://www.boost.org/doc/libs/1_43_0/libs/tokenizer/char_separator.htm上的示例&lt;该页面可以很容易地根据需要进行修改。
答案 4 :(得分:-1)
如果它们是空间分隔的话会更容易:
如果这是一个容易添加的要求。
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
string s = "1 2 4 8 16";
std::stringstream s_stream(s);
vector<int> n;
std::copy(std::istream_iterator<int>(s_stream), std::istream_iterator<int>(),
std::back_inserter(n)
);
}
如果你必须拥有';'然后可以插入一个简单的转换器类。
struct IntReader
{
int value;
operator int() {return value;}
friend std::istream& operator>>(std::istream& stream, IntReader& data)
{
char x = 0;
if ((stream >> data.value >> x) && (x != ';'))
{ stream.setstate(std::ios::failbit);
}
return stream;
}
};
然后只需更改副本即可使用它:
std::copy(std::istream_iterator<IntReader>(s_stream), std::istream_iterator<IntReader>(),
std::back_inserter(n)
);