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_string function 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 during std::transform() :

e.g. :

std::vector<std::string> stringvec; stringvec.reserve(v.size());   // reserve space v.size() elements 

live demo


Comments

Popular posts from this blog

java - How to specify maven bin in eclipse maven plugin? -

single sign on - Logging into Plone site with credentials passed through HTTP -

php - Why does AJAX not process login form? -