关于c ++:将整数字符串解析成std向量?

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];

当然,我可以用strtokatoi编写一个简单的代码。但是,C++Boost会有什么更短的代码呢?我从未尝试过Boost,但听说它可以像使用Python一样简单地编写代码。


它可以在没有助力的情况下完成:

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


嗯,boost::tokenizer?想知道我是否遗漏了一些东西,但这不是这个应用程序的理想选择吗?

示例:http://www.boost.org/doc/libs/1_43_0/libs/tokenizer/char_separator.htm<该页面可以根据需要轻松修改。