将整数字串解析为std向量?

时间:2011-12-09 20:23:09

标签: c++ string boost

  

可能重复:
  Parsing a comma-delimited std::string

我想将字符串解析为整数向量:

string s = "1;2;4;8;16;";
vector<int> n = parse_string(s);
// n == [1, 2, 4, 8, 16];

当然,我可以使用strtokatoi编写一个简单的代码。但是,用C ++提升会有什么更短的代码呢?我从来没有尝试使用Boost,但听说它可能只是你的代码就像使用Python一样。

5 个答案:

答案 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)
             );