将双打的刺痛转换为双打的向量的最佳方法是什么

What is the best way to convert a sting of doubles into a vector of doubles?

本文关键字:最佳 方法 向量 是什么 转换      更新时间:2023-10-16

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

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>才能正常工作。这是一个工作示例。

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

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

这是一种独特的方式:

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