更具体地说,我有一些结构的 vector
std::vector<SomeStruct> extensions = getThoseExtensions();
哪里someStructVariable.extensionName
返回一个字符串。
我想创建一组 extensionName
,像这样的东西 std::set<const char*>
.
使用一些 for
完成过程相当简单循环,但我想使用 std::transform
来自 <algorithm>
相反。
std::transform
有四个参数。
1,2。第一个范围(将第一个范围从和转换到)
3。第二范围/插入器(转换第二范围)
4。一个函数
这是我目前的情况
auto lambdaFn =
[](SomeStruct x) -> const char* { return x.extensionName; };
std::transform(availableExtensions.begin(),
availableExtensions.end(),
std::inserter(xs, xs.begin()),
lambdaFn);
因为 std::back_inserter
没有“适当的上下文”在 std::set
我正在使用 std::inserter(xs, xs.begin())
.
问题是我试图在我的 lambda 函数中返回堆栈内存。那么我该如何解决这个问题呢?
奇怪的是,如果我删除 return
从功能上看,它的工作原理与我期望的一样!但我不明白为什么,这让我担心 future 会受到影响。
编辑:
我正在使用多个结构来代替 SomeStruct
喜欢VkExtensionProperties
在 vulkan_core
中定义
typedef struct VkExtensionProperties {
char extensionName[VK_MAX_EXTENSION_NAME_SIZE];
uint32_t specVersion;
} VkExtensionProperties;
最佳答案
您可能无法创建一组 char *
除非 extensionName
的所有实例具有相同值的指向相同的 char 数组(它将存储唯一的指针而不是唯一的值)。如果你使用 std::set<std::string>
相反,这将既有效又只存储唯一值并解决您的变量生命周期问题 std::string
在必要时为您复制(或移动)自身:
auto lambdaFn =
[](const SomeStruct& x) { return std::string(x.extensionName); };
std::set<std::string> xs;
std::transform(availableExtensions.begin(),
availableExtensions.end(),
std::inserter(xs, xs.begin()),
lambdaFn);
关于c++ - 使用 std::transform 将 std::vector 容器转换为 std::set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59714189/