mrjbom
@mrjbom

STD::set erase не работает?

Вот такой код:
#define VK_KHR_SWAPCHAIN_EXTENSION_NAME   "VK_KHR_swapchain"

    std::set<const char*> notSupportedExtensionsNames;
    for (auto& extensionName : requiredExtensionsNames) {
        notSupportedExtensionsNames.insert(extensionName);
    }
    for (auto& extension : supportedExtensions) {
		if (!strcmp(extension.extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
			std::cout << "try erase " << "\"" << VK_KHR_SWAPCHAIN_EXTENSION_NAME << " \"" << "from notSupportedExtensionsNames\n";
			std::cout << "count: " << notSupportedExtensionsNames.count(VK_KHR_SWAPCHAIN_EXTENSION_NAME) << std::endl;
			std::cout << "strcmp: " << strcmp(extension.extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME) << std::endl;
			std::cout << "count: " << notSupportedExtensionsNames.count(extension.extensionName) << std::endl;
		}
        notSupportedExtensionsNames.erase(extension.extensionName);
    }


И такой очень забавный вывод:
count: 1
strcmp: 0
count: 0

Как это понимать?
VK_KHR_SWAPCHAIN_EXTENSION_NAME в сете он находит, а extension.extensionName он не находит, при условии что они равны) Просвятите?
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас в set хранятся указатели на char. В set они сравниваются как указатели. Как значения адресов. Strcmp же смотрит на содержимое памяти, на которую указатели ссылаются. Поэтому имея в памяти две совпадающие строки вы получите вот это вот - указатели не равны, а strcmp - равно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект