cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

Доработка find у *_set контейнеров #443

Closed Roman-Koshelev closed 3 years ago

Roman-Koshelev commented 3 years ago

Очень часто в кодовых базах я встречал что-то вроде

struct SName {
// ...
    std::string str;
// ...
};

std::map<const char*, SName> map;
SName sname;
map.insert(sname.str.c_str(), sname);
std::string find_str;
auto it = map.find(find_str.c_str());

Этот код ужасен, и не только с виду, но и неся кучу скрытых и очень опасных моментов (в которых легко отстрелить себе ногу).

Я вижу несколько возможных решений. Либо find будет принимать компаратор умеющий сравнивать элемент из set с переданным в find значением, либо map придется параметризовывать не только компаратором но и "отображением" (по-моему что-то такое появилось в ranges). Проблематично тк четвертым параметром шаблона у set идет Allocator который если сделать пятым то поломается совместимость, а если добавить после него то станет некрасиво и поломается то что аллокатор всегда последний

Roman-Koshelev commented 3 years ago

А нет. Такая возможность есть