将一串双打转换为双打矢量的最佳方法是什么?

时间:2013-11-13 00:38:04

标签: c++ string double

如果我有字符串“2.5 4.2 6.9 1.1”,如何尽可能有效地将其转换为双精度矢量?

3 个答案:

答案 0 :(得分:4)

vector<double> convert_string_to_vec(std::string const & str)
{
    std::istringstream input{str};
    vector<double> output{std::istream_iterator<double>{input},
                          std::istream_iterator<double>{}};

    return output;
}

您需要包含<sstream>以及<iterator>才能使用此功能。这是一个working example.

答案 1 :(得分:0)

这就是我通常会这样做的方式。可能不是最有效的方式,但非常简单。

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

int main()
{
    std::string d("2.5 4.2 6.9 1.1");
    std::stringstream s(d);
    std::vector<double> result;
    double temp;
    while(s >> temp)
    {
        result.push_back(temp);
    }
    for(size_t i = 0; i < result.size(); ++i)
    {
        std::cout << result[i] << "\n";
    }

    return 0;
}

答案 2 :(得分:0)

这是一种独特的方式:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

template <class Facet>
struct erasable_facet : Facet
{
    erasable_facet() : Facet(0) { }
    ~erasable_facet() { }
};

std::vector<double> convert(const std::string& str)
{
    using num_get = std::num_get<char>;

    erasable_facet<num_get> facet;

    std::stringbuf buf(str);
    std::vector<double> v;

    std::ios ios(nullptr);
    std::ios_base::iostate err = std::ios_base::goodbit;

    double d;
    std::istreambuf_iterator<char> it, end;

    do
    {
        it = facet.get(&buf, end, ios, err, d);
        buf.sbumpc(); // skip space

        if (!(err & std::ios_base::failbit) &&
            !(err & std::ios_base::badbit))
            v.push_back(d);
        else
            return v;
    } while (it != end);

    return v;
}

int main()
{
    std::string str = "1.24 5.32 9.53";

    auto v = convert(str);
}