- 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;
}
kurwa 10.05.2016 09:48 # +5
defecate-plusplus 10.05.2016 10:04 # +8
если по делу
1)
> А для std::map даже такого не придумали. Пора исправлять
я тебе даже больше скажу - удалять из std::map по value вместо key уже так себе идея - если тебе надо делать это часто, есть bimap контейнеры
2) operator ^= это пиздец, не надо так, мне не понятно что там скрывается - значит, никому не понятно
3) std::map<T1,T2> - будешь писать для каждого контейнера?
лучше напиши ещё несколько уровней шаблонов, чтобы эффективно удалять из контейнера, где удаление из середины дешево, так и из контейнера, где удаление из середины дорого,
заодно напиши хелпер, который будет уметь сравниваться с понятным ему iterator::reference, используя магические вещи типа _ для обозначения "подойдет любое" - чтобы получилось вот тогда шаблоноёбство заиграет новыми красками
а так это детский сад какой-то
Antervis 10.05.2016 10:31 # −5
Не две, а шесть. Встречать их повсеместно надоедает.
> я тебе даже больше скажу - удалять из std::map по value вместо key уже так себе идея
куда важнее удаление по fn(value)
> есть bimap контейнеры
Это надо буст тянуть, а всем читающим код разбираться что такое bimap
> operator ^= это пиздец, не надо так
ок
> мне не понятно что там скрывается - значит, никому не понятно
ЧСВ over 9000
defecate-plusplus 10.05.2016 10:57 # +5
не знать, что такое буст, или бояться 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);
> Встречать их повсеместно надоедает.
поэтому функция с говорящим именем круче оператора
^= читается как "поксорь все элементы контейнера с указанным значением"
Dummy00001 10.05.2016 11:44 # 0
> куда важнее удаление по fn(value)
и на сколько часто ты это делаешь?
Antervis 10.05.2016 12:01 # 0
Dummy00001 10.05.2016 14:14 # +2
напиши лучше простую человеческую функцию.
bormand 10.05.2016 21:10 # +3
Это не ЧСВ, а просто опыт работы в команде... Вот сам же потом забудешь через год, что делает оператор ^ для мапов...
Пиши код так, как будто сопровождать его будет склонный к насилию психопат.
Antervis 11.05.2016 05:21 # +3
его и так мне сопровождать
3_dar 10.05.2016 20:00 # 0
Пролог-style
defecate-plusplus 10.05.2016 20:25 # 0
я адаптировал
bormand 10.05.2016 20:39 # 0
inkanus-gray 10.05.2016 21:23 # +1
bormand 10.05.2016 20:55 # +4
Угу. Если уж шило в жопе и хочется именно оператор, я бы для удаления элементов выбрал -=.
bormand 10.05.2016 21:00 # 0
defecate-plusplus 10.05.2016 20:47 # 0
что за нетерпимость
стыдно, товарищи
bormand 10.05.2016 20:53 # 0