c++ - Convert vector<double> to vector<string> ( elegant way ) -
i know if there elegant way or built-in function convert vector<double> vector<string>. i've done simple
#include <iostream> #include <string> #include <vector> #include <sstream> std::vector<std::string> doubevectostr(const std::vector<double>& vec) { std::vector<std::string> tempstr; (unsigned int i(0); < vec.size(); ++i){ std::ostringstream doublestr; doublestr << vec[i]; tempstr.push_back(doublestr.str()); } return tempstr; } int main( int argc, char* argv[] ) { std::vector<double> doublevec; doublevec.push_back(1.0); doublevec.push_back(2.1); doublevec.push_back(3.2); std::vector<std::string> doublestr; doublestr = doubevectostr(doublevec); (unsigned int i(0); < doublestr.size(); ++i) std::cout << doublestr[i] << " "; std::cout << std::endl; return 0; }
there many ways, standard solution use std::transform lambda using std::to_string conversion :
std::transform(std::begin(doublevec), std::end(doublevec), std::back_inserter(doublestr), [](double d) { return std::to_string(d); } ); and can wrap in function template make work standard compliant container :
template<class iteratorin, class iteratorout> void to_string(iteratorin first, iteratorin last, iteratorout out) { std::transform(first, last, out, [](typename std::iterator_traits<iteratorin>::value_type d) { return std::to_string(d); } ); } or in c++14, generic lambda :
template<class iteratorin, class iteratorout> void to_string(iteratorin first, iteratorin last, iteratorout out) { std::transform(first, last, out, [](auto d) { return std::to_string(d); } ); } and call container (i.e. works std::list<int>, instance) :
to_string(std::begin(doublevec), std::end(doublevec), std::back_inserter(doublestr)); notes :
- if don't have c++11 compiler, write own
to_stringfunction template :
example:
template<class t> std::string my_to_string(t v) { std::stringstream ss; ss << v; return ss.str(); } and use in similar way :
std::transform(doublevec.begin(), doublevec.end(), std::back_inserter(doublestr), my_to_string<double> ); - you should
reserve()memory in output vector avoid reallocations duringstd::transform():
e.g. :
std::vector<std::string> stringvec; stringvec.reserve(v.size()); // reserve space v.size() elements
Comments
Post a Comment