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

Parse string of integers into std vector?

本文关键字:std 向量 整数 字符串      更新时间:2023-10-16

可能的重复项:
解析逗号分隔的 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一样简化您的代码。

它可以在没有 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))

我不是提升专业,所以我的代码并不理想:

#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

我认为在这种情况下应该使用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<>。

boost::tokenizer ?想知道我是否遗漏了什么,但这不是这个应用程序的理想选择吗?

http://www.boost.org/doc/libs/1_43_0/libs/tokenizer/char_separator.htm <该页面的示例可以很容易地修改为此处的需要。>

如果它们以空格分隔,则更容易:
如果这是一个很容易添加的要求。

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