- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
#include <iostream>
#include <map>
template <typename T1, typename T2, typename F>
void operator ^= (std::map<T1,T2> &m, F func) {
for (typename std::map<T1,T2>::iterator i = m.begin(); i != m.end(); ) {
if (func(i))
i = m.erase(i);
else
++i;
}
}
template <typename T1, typename T2>
void operator ^= (std::map<T1,T2> &m, T2 value) {
for (typename std::map<T1,T2>::iterator i = m.begin(); i != m.end(); ) {
if (value == i->second)
i = m.erase(i);
else
++i;
}
}
int main() {
std::map<int,bool> m = {
{0,false},
{1,true},
{2,false},
{3,true},
{4,false},
{5,true},
{6,false},
{7,true},
{8,false},
{9,true},
{10,false}
};
for (auto i = m.begin(); i != m.end(); ++i)
std::cout << "{" << i->first << "," << i->second << "} ";
std::cout << std::endl;
m ^= false;
m ^= [](auto &i) { return i->first == 5; };
for (auto i = m.begin(); i != m.end(); ++i)
std::cout << "{" << i->first << "," << i->second << "} ";
std::cout << std::endl;
}
если по делу
1)
> А для std::map даже такого не придумали. Пора исправлять
я тебе даже больше скажу - удалять из std::map по value вместо key уже так себе идея - если тебе надо делать это часто, есть bimap контейнеры
2) operator ^= это пиздец, не надо так, мне не понятно что там скрывается - значит, никому не понятно
3) std::map<T1,T2> - будешь писать для каждого контейнера?
лучше напиши ещё несколько уровней шаблонов, чтобы эффективно удалять из контейнера, где удаление из середины дешево, так и из контейнера, где удаление из середины дорого,
заодно напиши хелпер, который будет уметь сравниваться с понятным ему iterator::reference, используя магические вещи типа _ для обозначения "подойдет любое" - чтобы получилось вот тогда шаблоноёбство заиграет новыми красками
а так это детский сад какой-то
Не две, а шесть. Встречать их повсеместно надоедает.
> я тебе даже больше скажу - удалять из std::map по value вместо key уже так себе идея
куда важнее удаление по fn(value)
> есть bimap контейнеры
Это надо буст тянуть, а всем читающим код разбираться что такое bimap
> operator ^= это пиздец, не надо так
ок
> мне не понятно что там скрывается - значит, никому не понятно
ЧСВ over 9000
не знать, что такое буст, или бояться header-only библиотек могут позволить себе только qt-профессионалы, которым и c++ и STL в тягость
> куда важнее удаление по fn(value)
ок, boost.multiindex
> Не две, а шесть
или одна:
for (auto i = mymap.begin(); i != mymap.end(); i = func(i) ? mymap.erase(i) : i+1);
> Встречать их повсеместно надоедает.
поэтому функция с говорящим именем круче оператора
^= читается как "поксорь все элементы контейнера с указанным значением"
> куда важнее удаление по fn(value)
и на сколько часто ты это делаешь?
напиши лучше простую человеческую функцию.
Это не ЧСВ, а просто опыт работы в команде... Вот сам же потом забудешь через год, что делает оператор ^ для мапов...
Пиши код так, как будто сопровождать его будет склонный к насилию психопат.
его и так мне сопровождать
Пролог-style
я адаптировал
Угу. Если уж шило в жопе и хочется именно оператор, я бы для удаления элементов выбрал -=.
что за нетерпимость
стыдно, товарищи