c++ - 使用 std::transform 将 std::vector 容器转换为 std::set

标签 c++ c++11

更具体地说,我有一些结构的 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喜欢VkExtensionPropertiesvulkan_core 中定义

typedef struct VkExtensionProperties {
    char        extensionName[VK_MAX_EXTENSION_NAME_SIZE];
    uint32_t    specVersion;
} VkExtensionProperties;

来自 Khronos specs

最佳答案

您可能无法创建一组 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/

相关文章:

c++ - 设置 3d 空间中对象的方向

c++ - move 分配比复制分配慢——错误、功能或未指定?

c++ - 从程序执行批处理文件

c++ - Qt Parent 在 child 关闭后删除变量

c++ - 用逗号相互依赖初始化?

c++ - 在命名空间 foo 中声明 swap() 然后在同一命名空间下使用 swap() 而不是 foo::swap() 是否意味着 foo::swap()?

c++ - 由于未知的模板定义,模板特化失败

templates - 使用 std::make_shared 拥有自己的 std::shared_ptr

c++ - 缺少预期的对象构造

c++ - 如何避免捕获的成员在 C++11 的 lambda 表达式中被任意表达式初始化?