If I have the string "2.5 4.2 6.9 1.1", how can I convert that into a vector of doubles as efficiently as possible?
如果我有字符串“2.5 4.2 6.9 1.1”,我怎样才能尽可能有效地将其转换为双精度矢量?
4
vector convert_string_to_vec(std::string const & str) { std::istringstream input{str}; vector output{std::istream_iterator{input}, std::istream_iterator{}}; return output; }
You'll need to include as well as for this to work. Here's a working example.
您需要包含 以及 才能使其正常工作。这是一个有效的例子。
0
This is how I would generally do it. Possibly not the most efficient way, but very simple.
这就是我通常会这样做的方式。可能不是最有效的方式,但非常简单。
#include #include #include #include int main() { std::string d("2.5 4.2 6.9 1.1"); std::stringstream s(d); std::vector result; double temp; while(s >> temp) { result.push_back(temp); } for(size_t i = 0; i
Here's a unique way:
这是一种独特的方式:
#include #include #include #include template struct erasable_facet : Facet { erasable_facet() : Facet(0) { } ~erasable_facet() { } }; std::vector convert(const std::string& str) { using num_get = std::num_get; erasable_facet facet; std::stringbuf buf(str); std::vector v; std::ios ios(nullptr); std::ios_base::iostate err = std::ios_base::goodbit; double d; std::istreambuf_iterator 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); }