如何以优雅/快速的方式将STL字符串向量转换为char*?

sra*_*mij 1 c++ string stl vector

这分为较小的阶段:

  1. 如何计算向量中所有字符串的总长度?
  2. 分配char*mem空间
  3. 将矢量字符串复制到该空间中

有一种快速优雅的方式吗?

Ben*_*ley 7

我能想到的最优雅但也许不是最快捷的方式如下:

std::string s = std::accumulate(v.begin(), v.end(), std::string());
char * c = new char[s.size() + 1];
std::strcpy(c,s.c_str());
Run Code Online (Sandbox Code Playgroud)

虽然我不是一个赤裸裸的动态分配的粉丝,而且我个人永远不会使用它,但我会留下让你理清.

如果你需要在元素之间添加空格分隔符,它会变得有点复杂,我可能会使用不同的解决方案,如下所示:

std::ostringstream oss;
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(oss," "));
size_t sz = oss.str().size();
if(sz) --sz; // truncate trailing space if there is one
char * c = new char[sz+1];
std::copy_n(oss.str().c_str(), sz, c);
c[sz] = 0;
Run Code Online (Sandbox Code Playgroud)


ild*_*arn 5

这是一个C++ 0x实现:

#include <cstddef>
#include <algorithm>
#include <numeric>
#include <string>
#include <vector>

std::vector<char> concat_strings(std::vector<std::string> const& vecs)
{
    std::size_t const cumulative_length = std::accumulate(
        vecs.begin(),
        vecs.end(),
        static_cast<std::size_t>(0),
        [](std::size_t const acc, std::string const& str)
        {
            return acc + str.size();
        }
    );

    std::vector<char> ret;
    ret.reserve(cumulative_length);

    std::for_each(
        vecs.begin(),
        vecs.end(),
        [&ret](std::string const& str)
        {
            ret.insert(ret.end(), str.begin(), str.end());
        }
    );

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

结果std::vector<char>是你的有效char*.

对于C++ 03这将是大致相同的,但你会在地方的lambda表达式需要适当的函子(或使用C++ 03λ文库如升压.凤凰).