将 std::vector<std::string> 转换为 const char* const*

Convert std::vector<std::string> to const char* const*

本文关键字:const std vector char 转换 string gt lt      更新时间:2023-10-16

我正在使用 Vulkan,我正在尝试将我的验证层作为vector<string>传递。但是来自 VkInstanceCreateInfo 的字段ppEnabledLayerNames只需要const char* const*。我不了解类型以及如何将矢量的数据转换为它。

std::vector<std::string> v = {
"VK_LAYER_LUNARG_standard_validation"
};
const char* const* data = std::accumulate(std::next(v.begin()), v.end(),
v[0],
[](std::string a, std::string b) {
return a + b;
}).c_str();

但是当我编译时,我得到了这个:

error: cannot convert ‘const char*’ to ‘const char* const*’ in assignment
}).c_str();

这是一个活生生的例子

有了c_str,你会得到const char*const char* const*const char*数组。

vector<string> vectorOfStrings = {
"Aa", 
"Bb", 
"Cc"
};
vector<const char*> vectorOfCStyleStrings(3);
// convert from string to C style strings
for (string item : vectorOfStrings)
vectorOfCStyleStrings.push_back(item.c_str());
// get vector like a const C style array
const char* const* arrayOfCStyleStrings = vectorOfCStyleStrings.data();

这是一种在std::string上执行此操作的方法:

const std::string str = "test";
const char* str_p = str.c_str();
const char* const* ppEnabledExtensionNames = &str_p;

如果c_str()是被丢弃的临时字符串的一部分,请小心。在完成此操作之前,可能需要保留对基字符串对象的引用。

这是您在代码段中执行的操作:

  • 连接v中的所有字符串(如果v为空,则崩溃(;
  • 扔掉生成的字符串;
  • 尝试将悬空指针分配给const charconst char* const*

最后一部分没有编译,但这是一件好事 - 在运行时处理这个问题将是一个可悲的过期。

通过接口的外观(即ppEnabledLayerNames参数(,人们可以猜测您首先不想连接字符串,而是想要传递一个 c 字符串数组。

以下是从vector<string>获取它的方法:

vector<const char*> layer_names(v.size());
std::transform(v.begin(), v.end(), layer_names.begin(), [](const string& s)
{ return s.c_str(); });
const char* const* data = layer_names.data(); 

请注意,它仅在销毁layer_namesv之前有效。

更好的方法是为 Vulkan 找到一个C++友好的界面,但我无能为力。

今天早上我终于找到了解决方案,使用std::accumulate

auto d = std::accumulate(
std::next(v.begin()), v.end(),
v[0],
[](std::string a, std::string b) {
return a + b;
}).c_str();
const char* const* data = &d;