Parse string of integers into std vector?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Parsing a comma-delimited std::string
我要将字符串解析为整数向量:
1 2 3 | string s ="1;2;4;8;16;"; vector<int> n = parse_string(s); // n == [1, 2, 4, 8, 16]; |
当然,我可以用
它可以在没有助力的情况下完成:
1 2 3 4 5 | 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代码,你必须写:
1 2 3 4 5 6 7 8 9 10 11 | 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)) |
我不是Boost Profi,所以我的代码不理想:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #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; } } |
你可以处理的是肯定的
我认为在这种情况下应该使用两种不同的算法。第一个是解析器,它将分隔您的值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<>。
如果它们是空间分隔的,则更容易:如果这是一个很容易添加的需求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <vector> #include <iterator> #include 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) ); } |
如果必须具有";",则可以插入一个简单的转换器类。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } }; |
然后只需更改副本即可使用:
1 2 3 | std::copy(std::istream_iterator<IntReader>(s_stream), std::istream_iterator<IntReader>(), std::back_inserter(n) ); |
嗯,
示例:http://www.boost.org/doc/libs/1_43_0/libs/tokenizer/char_separator.htm<该页面可以根据需要轻松修改。