将vector <double>转换为vector <string>(优雅方式)</string> </double>

时间:2014-08-18 20:55:24

标签: c++ string vector double

我想知道是否有一种优雅的方式或内置函数可以将vector<double>转换为vector<string>。我所做的很简单

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


std::vector<std::string> doubeVecToStr(const std::vector<double>& vec)
{
    std::vector<std::string> tempStr;

    for (unsigned int i(0); i < 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);

    for (unsigned int i(0); i < doubleStr.size(); ++i)
        std::cout << doubleStr[i] << "  ";

    std::cout << std::endl;

    return 0;
}

3 个答案:

答案 0 :(得分:35)

有很多种方法,但标准的解决方案是使用std::transform和lambda使用std::to_string进行转换:

std::transform(std::begin(doubleVec),
               std::end(doubleVec), 
               std::back_inserter(doubleStr),
               [](double d) { return std::to_string(d); } 
              );

您可以将其包装在函数模板中,以使其适用于任何符合标准的容器:

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

或者在 C ++ 14 中,使用通用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); } );
}

并使用任何容器调用它(例如,它与std::list<int>一起使用):

to_string(std::begin(doubleVec), std::end(doubleVec), std::back_inserter(doubleStr));

注意:

  • 如果您没有C ++ 11编译器,请编写自己的to_string函数模板:

示例:

template<class T>
std::string my_to_string(T v)
{
    std::stringstream ss;
    ss << v;
    return ss.str();
}

以类似的方式使用它:

std::transform(doubleVec.begin(),
               doubleVec.end(),
               std::back_inserter(doubleStr), 
               my_to_string<double> );
  • 您应该reserve()输出向量中的内存,以避免在std::transform()期间重新分配:

e.g。这样做:

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

Live demo

答案 1 :(得分:5)

使用copyostream_iterator

#include <vector>
#include <iostream>
#include <sstream>
#include <iterator>

int main()
{
  std::vector<double> numbers{1.0, 2.1, 3.2};
  std::stringstream output;
  std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<double>(output, " "));

  std::cout << output.str() << std::endl;
}

答案 2 :(得分:5)

一般情况下,如果您有一个T的容器,并希望从U的容器中创建一个T的容器,正如其他人提到的那样,要查找的算法是{ {1}}。

如果您不使用C ++ 11,则std::transform用法为:

std::transform

输出: #include <algorithm> #include <vector> #include <string> #include <iostream> #include <iterator> #include <sstream> std::string Transformer(double d) { std::ostringstream doubleStr; doubleStr << d; return doubleStr.str(); } int main() { std::vector<double> doubleVec; doubleVec.push_back(1.0); doubleVec.push_back(2.1); doubleVec.push_back(3.2); std::vector<std::string> doubleStr; std::transform(doubleVec.begin(), doubleVec.end(), std::back_inserter(doubleStr), Transformer); std::copy(doubleStr.begin(), doubleStr.end(), std::ostream_iterator<std::string>(std::cout, " ")); }