Более конкретно, у меня есть вектор некоторой структуры
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())
.
Проблема в том, что я пытаюсь вернуть стековую память в моей лямбда-функции. Итак, как мне обойти эту проблему?
Как ни странно, если я удаляю return
из функции, она работает так, как я и ожидал! Но я не понимаю, почему, и это вселяет страх перед будущими последствиями.
РЕДАКТИРОВАТЬ:
Я использую несколько структур вместо SomeStruct
как VkExtensionProperties
, определенный в vulkan_core
typedef struct VkExtensionProperties {
char extensionName[VK_MAX_EXTENSION_NAME_SIZE];
uint32_t specVersion;
} VkExtensionProperties;
От Спецификации Khronos