将向量转换为向量(优雅的方式)

2024-03-10

我想知道是否有一种优雅的方式或内置函数来转换vector<double> to 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;
}

有很多方法,但标准解决方案是使用std::transform http://en.cppreference.com/w/cpp/algorithm/transform与 lambda 使用std::to_string http://en.cppreference.com/w/cpp/string/basic_string/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); } );
}

Or in 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));

Notes :

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

Example:

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() http://en.cppreference.com/w/cpp/container/vector/reserve输出向量中的内存以避免在期间重新分配std::transform() :

例如做这个 :

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

现场演示 http://coliru.stacked-crooked.com/a/76f397afed2f9b60

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将向量转换为向量(优雅的方式) 的相关文章

随机推荐