如何在c ++中将vector <string>转换为const char*const*?

mal*_*lle 3 c++ data-conversion

我正在尝试将数据转换为适合特定单元测试的格式.任务是挖掘一组单词,单元测试将确保结果是正确的.我无法访问单元测试,只需要获取const char*const*Result的声明.

所以我需要得到我的

std::vector<string> Words; 
Run Code Online (Sandbox Code Playgroud)

const char* const* Result;
Run Code Online (Sandbox Code Playgroud)

除以非alpha字符(例如空格).

我知道这是一个常量字符的常量指针,所以我不知道该怎么做,因为它们都是常数?

任何指针(单词双关语并非真正意图)表示赞赏!

Sto*_*ica 6

看起来很简单

#include <algorithm>
#include <functional>

// ...

std::vector<char const*> result_owner(Words.size());
std::transform(begin(Words), end(Words), begin(result_owner), 
               std::mem_fn(&std::string::c_str));

const char* const* Result = result_owner.data();
Run Code Online (Sandbox Code Playgroud)

仅仅因为Result必须提供缓冲区的const视图,并不意味着缓冲区必须真正是const本身.所以,这只是我们通过投影得到另一个向量Words上的std::string::c_str成员.

之后Result可以简单地作为另一个参考result_owner.data();.

当然,这假设Result不一定要拥有它指向的缓冲区.最好避免拥有原始指针.


eer*_*ika 6

你不能有意义地将一个转换为另一个.但是,您可以将数组转换std::string为指向char的指针数组,并且指向此类数组的第一个元素的指针将与您所需的结果兼容:

std::vector<const char*> Ptrs;
std::transform(
    std::cbegin(Words), std::cend(Words),
    std::back_inserter(Ptrs),
    [](auto& str)  { return str.c_str(); }
);
const char* const* Result = Ptrs.data();
Run Code Online (Sandbox Code Playgroud)

请记住,字符串本身仍然存储在std::string对象中,只要原始向量中的字符串存在,未调整大小,并且原始向量本身未调整大小,新向量中的那些指针才有效.

并且只要该向量存在且未调整大小,指向新向量的第一个元素的指针才有效.